mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-11-25 13:51:41 +00:00
merging zlib 1.1.3 from 0.9.2 branch to trunk, a=chofmann, bug 86323
This commit is contained in:
parent
6ff1a8d53c
commit
cb976acc61
@ -28,6 +28,8 @@
|
|||||||
|
|
||||||
MAKE_OBJ_TYPE=LIB
|
MAKE_OBJ_TYPE=LIB
|
||||||
|
|
||||||
|
LCFLAGS = -DZLIB_DLL
|
||||||
|
|
||||||
!ifdef BUILD_DEBUG_GC
|
!ifdef BUILD_DEBUG_GC
|
||||||
LCFLAGS = $(LCFLAGS) -DDEBUG_GC
|
LCFLAGS = $(LCFLAGS) -DDEBUG_GC
|
||||||
!endif
|
!endif
|
||||||
|
@ -28,6 +28,8 @@
|
|||||||
|
|
||||||
MAKE_OBJ_TYPE=LIB
|
MAKE_OBJ_TYPE=LIB
|
||||||
|
|
||||||
|
LCFLAGS = -DZLIB_DLL
|
||||||
|
|
||||||
!ifdef BUILD_DEBUG_GC
|
!ifdef BUILD_DEBUG_GC
|
||||||
LCFLAGS = $(LCFLAGS) -DDEBUG_GC
|
LCFLAGS = $(LCFLAGS) -DDEBUG_GC
|
||||||
!endif
|
!endif
|
||||||
|
@ -45,6 +45,8 @@ OBJS=.\$(OBJDIR)\nsZipArchive.obj \
|
|||||||
.\$(OBJDIR)\nsWildCard.obj \
|
.\$(OBJDIR)\nsWildCard.obj \
|
||||||
$(NULL)
|
$(NULL)
|
||||||
|
|
||||||
|
LCFLAGS=-DZLIB_DLL=1
|
||||||
|
|
||||||
LINCS= \
|
LINCS= \
|
||||||
-I$(PUBLIC)\security \
|
-I$(PUBLIC)\security \
|
||||||
-I$(XPDIST)\public\nspr \
|
-I$(XPDIST)\public\nspr \
|
||||||
|
@ -28,7 +28,7 @@ pref("network.search.url","http://cgi.netscape.com/cgi-bin/url_search.cgi?search
|
|||||||
pref("keyword.URL", "http://keyword.netscape.com/keyword/");
|
pref("keyword.URL", "http://keyword.netscape.com/keyword/");
|
||||||
pref("keyword.enabled", true);
|
pref("keyword.enabled", true);
|
||||||
pref("general.useragent.locale", "chrome://navigator/locale/navigator.properties");
|
pref("general.useragent.locale", "chrome://navigator/locale/navigator.properties");
|
||||||
pref("general.useragent.misc", "rv:0.9.1+");
|
pref("general.useragent.misc", "rv:0.9.2+");
|
||||||
|
|
||||||
pref("general.startup.browser", true);
|
pref("general.startup.browser", true);
|
||||||
pref("general.startup.mail", false);
|
pref("general.startup.mail", false);
|
||||||
|
Binary file not shown.
@ -1,74 +1,123 @@
|
|||||||
zlib 1.0.4 is a general purpose data compression library. All the code
|
zlib 1.1.3 is a general purpose data compression library. All the code
|
||||||
is reentrant (thread safe). The data format used by the zlib library
|
is thread safe. The data format used by the zlib library
|
||||||
is described by RFCs (Request for Comments) 1950 to 1952 in the files
|
is described by RFCs (Request for Comments) 1950 to 1952 in the files
|
||||||
ftp://ds.internic.net/rfc/rfc1950.txt (zlib format), rfc1951.txt (deflate
|
ftp://ds.internic.net/rfc/rfc1950.txt (zlib format), rfc1951.txt (deflate
|
||||||
format) and rfc1952.txt (gzip format). These documents are also available in
|
format) and rfc1952.txt (gzip format). These documents are also available in
|
||||||
other formats from ftp://ftp.uu.net/graphics/png/documents/zlib/zdoc-index.html
|
other formats from ftp://ftp.uu.net/graphics/png/documents/zlib/zdoc-index.html
|
||||||
|
|
||||||
All functions of the compression library are documented in the file
|
All functions of the compression library are documented in the file zlib.h
|
||||||
zlib.h. A usage example of the library is given in the file example.c
|
(volunteer to write man pages welcome, contact jloup@gzip.org). A usage
|
||||||
which also tests that the library is working correctly. Another
|
example of the library is given in the file example.c which also tests that
|
||||||
example is given in the file minigzip.c. The compression library itself
|
the library is working correctly. Another example is given in the file
|
||||||
is composed of all source files except example.c and minigzip.c.
|
minigzip.c. The compression library itself is composed of all source files
|
||||||
|
except example.c and minigzip.c.
|
||||||
|
|
||||||
To compile all files and run the test program, follow the instructions
|
To compile all files and run the test program, follow the instructions
|
||||||
given at the top of Makefile. In short "make test; make install"
|
given at the top of Makefile. In short "make test; make install"
|
||||||
should work for most machines. For MSDOS, use one of the special
|
should work for most machines. For Unix: "configure; make test; make install"
|
||||||
makefiles such as Makefile.msc; for VMS, use Make_vms.com or descrip.mms.
|
For MSDOS, use one of the special makefiles such as Makefile.msc.
|
||||||
|
For VMS, use Make_vms.com or descrip.mms.
|
||||||
|
|
||||||
Questions about zlib should be sent to <zlib@quest.jpl.nasa.gov> or,
|
Questions about zlib should be sent to <zlib@quest.jpl.nasa.gov>, or to
|
||||||
if this fails, to the addresses given below in the Copyright section.
|
Gilles Vollant <info@winimage.com> for the Windows DLL version.
|
||||||
The zlib home page is http://quest.jpl.nasa.gov/zlib/
|
The zlib home page is http://www.cdrom.com/pub/infozip/zlib/
|
||||||
|
The official zlib ftp site is ftp://ftp.cdrom.com/pub/infozip/zlib/
|
||||||
|
Before reporting a problem, please check those sites to verify that
|
||||||
|
you have the latest version of zlib; otherwise get the latest version and
|
||||||
|
check whether the problem still exists or not.
|
||||||
|
|
||||||
The changes made in version 1.0.4 are documented in the file ChangeLog.
|
Mark Nelson <markn@tiny.com> wrote an article about zlib for the Jan. 1997
|
||||||
The main changes since 1.0.3 are:
|
issue of Dr. Dobb's Journal; a copy of the article is available in
|
||||||
|
http://web2.airmail.net/markn/articles/zlibtool/zlibtool.htm
|
||||||
|
|
||||||
- In very rare conditions, deflate(s, Z_FINISH) could fail to produce an EOF
|
The changes made in version 1.1.3 are documented in the file ChangeLog.
|
||||||
bit, so the decompressor could decompress all the correct data but went
|
The main changes since 1.1.2 are:
|
||||||
on to attempt decompressing extra garbage data. This affected minigzip too.
|
|
||||||
- zlibVersion and gzerror return const char* (needed for DLL)
|
|
||||||
- port to RISCOS (no fdopen, no multiple dots, no unlink, no fileno)
|
|
||||||
|
|
||||||
|
- fix "an inflate input buffer bug that shows up on rare but persistent
|
||||||
|
occasions" (Mark)
|
||||||
|
- fix gzread and gztell for concatenated .gz files (Didier Le Botlan)
|
||||||
|
- fix gzseek(..., SEEK_SET) in write mode
|
||||||
|
- fix crc check after a gzeek (Frank Faubert)
|
||||||
|
- fix miniunzip when the last entry in a zip file is itself a zip file
|
||||||
|
(J Lillge)
|
||||||
|
- add contrib/asm586 and contrib/asm686 (Brian Raiter)
|
||||||
|
See http://www.muppetlabs.com/~breadbox/software/assembly.html
|
||||||
|
- add support for Delphi 3 in contrib/delphi (Bob Dellaca)
|
||||||
|
- add support for C++Builder 3 and Delphi 3 in contrib/delphi2 (Davide Moretti)
|
||||||
|
- do not exit prematurely in untgz if 0 at start of block (Magnus Holmgren)
|
||||||
|
- use macro EXTERN instead of extern to support DLL for BeOS (Sander Stoks)
|
||||||
|
- added a FAQ file
|
||||||
|
|
||||||
|
plus many changes for portability.
|
||||||
|
|
||||||
|
Unsupported third party contributions are provided in directory "contrib".
|
||||||
|
|
||||||
|
A Java implementation of zlib is available in the Java Development Kit 1.1
|
||||||
|
http://www.javasoft.com/products/JDK/1.1/docs/api/Package-java.util.zip.html
|
||||||
|
See the zlib home page http://www.cdrom.com/pub/infozip/zlib/ for details.
|
||||||
|
|
||||||
A Perl interface to zlib written by Paul Marquess <pmarquess@bfsec.bt.co.uk>
|
A Perl interface to zlib written by Paul Marquess <pmarquess@bfsec.bt.co.uk>
|
||||||
is in the CPAN (Comprehensive Perl Archive Network) sites, such as:
|
is in the CPAN (Comprehensive Perl Archive Network) sites, such as:
|
||||||
ftp://ftp.cis.ufl.edu/pub/perl/CPAN/modules/by-module/Compress/Compress-Zlib*
|
ftp://ftp.cis.ufl.edu/pub/perl/CPAN/modules/by-module/Compress/Compress-Zlib*
|
||||||
|
|
||||||
|
A Python interface to zlib written by A.M. Kuchling <amk@magnet.com>
|
||||||
|
is available in Python 1.5 and later versions, see
|
||||||
|
http://www.python.org/doc/lib/module-zlib.html
|
||||||
|
|
||||||
|
A zlib binding for TCL written by Andreas Kupries <a.kupries@westend.com>
|
||||||
|
is availlable at http://www.westend.com/~kupries/doc/trf/man/man.html
|
||||||
|
|
||||||
|
An experimental package to read and write files in .zip format,
|
||||||
|
written on top of zlib by Gilles Vollant <info@winimage.com>, is
|
||||||
|
available at http://www.winimage.com/zLibDll/unzip.html
|
||||||
|
and also in the contrib/minizip directory of zlib.
|
||||||
|
|
||||||
|
|
||||||
Notes for some targets:
|
Notes for some targets:
|
||||||
|
|
||||||
- For Turbo C the small model is supported only with reduced performance to
|
- To build a Windows DLL version, include in a DLL project zlib.def, zlib.rc
|
||||||
avoid any far allocation; it was tested with -DMAX_WBITS=11 -DMAX_MEM_LEVEL=3
|
and all .c files except example.c and minigzip.c; compile with -DZLIB_DLL
|
||||||
|
The zlib DLL support was initially done by Alessandro Iacopetti and is
|
||||||
|
now maintained by Gilles Vollant <info@winimage.com>. Check the zlib DLL
|
||||||
|
home page at http://www.winimage.com/zLibDll
|
||||||
|
|
||||||
- For 64-bit Iris, deflate.c must be compiled without any optimization.
|
From Visual Basic, you can call the DLL functions which do not take
|
||||||
|
a structure as argument: compress, uncompress and all gz* functions.
|
||||||
|
See contrib/visual-basic.txt for more information, or get
|
||||||
|
http://www.tcfb.com/dowseware/cmp-z-it.zip
|
||||||
|
|
||||||
|
- For 64-bit Irix, deflate.c must be compiled without any optimization.
|
||||||
With -O, one libpng test fails. The test works in 32 bit mode (with
|
With -O, one libpng test fails. The test works in 32 bit mode (with
|
||||||
the -32 compiler flag). The compiler bug has been reported to SGI.
|
the -n32 compiler flag). The compiler bug has been reported to SGI.
|
||||||
|
|
||||||
- zlib doesn't work with gcc 2.6.3 on a DEC 3000/300LX under OSF/1 2.1
|
- zlib doesn't work with gcc 2.6.3 on a DEC 3000/300LX under OSF/1 2.1
|
||||||
it works when compiled with cc.
|
it works when compiled with cc.
|
||||||
|
|
||||||
- zlib doesn't work on HP-UX 9.05 with one cc compiler (the one not
|
- on Digital Unix 4.0D (formely OSF/1) on AlphaServer, the cc option -std1
|
||||||
accepting the -O option). It works with the other cc compiler.
|
is necessary to get gzprintf working correctly. This is done by configure.
|
||||||
|
|
||||||
- To build a Windows DLL version, include in a DLL project zlib.def, zlib.rc
|
- zlib doesn't work on HP-UX 9.05 with some versions of /bin/cc. It works
|
||||||
and all .c files except example.c and minigzip.c; compile with -DZLIB_DLL
|
with other compilers. Use "make test" to check your compiler.
|
||||||
For help on building a zlib DLL, contact Alessandro Iacopetti
|
|
||||||
<iaco@email.alessandria.alpcom.it> http://lisa.unial.it/iaco ,
|
|
||||||
or contact Brad Clarke <bclarke@cyberus.ca>.
|
|
||||||
|
|
||||||
- gzdopen is not supported on RISCOS
|
- gzdopen is not supported on RISCOS, BEOS and by some Mac compilers.
|
||||||
|
|
||||||
|
- For Turbo C the small model is supported only with reduced performance to
|
||||||
|
avoid any far allocation; it was tested with -DMAX_WBITS=11 -DMAX_MEM_LEVEL=3
|
||||||
|
|
||||||
|
- For PalmOs, see http://www.cs.uit.no/~perm/PASTA/pilot/software.html
|
||||||
|
Per Harald Myrvang <perm@stud.cs.uit.no>
|
||||||
|
|
||||||
|
|
||||||
Acknowledgments:
|
Acknowledgments:
|
||||||
|
|
||||||
The deflate format used by zlib was defined by Phil Katz. The deflate
|
The deflate format used by zlib was defined by Phil Katz. The deflate
|
||||||
and zlib specifications were written by Peter Deutsch. Thanks to all the
|
and zlib specifications were written by L. Peter Deutsch. Thanks to all the
|
||||||
people who reported problems and suggested various improvements in zlib;
|
people who reported problems and suggested various improvements in zlib;
|
||||||
they are too numerous to cite here.
|
they are too numerous to cite here.
|
||||||
|
|
||||||
Copyright notice:
|
Copyright notice:
|
||||||
|
|
||||||
(C) 1995-1996 Jean-loup Gailly and Mark Adler
|
(C) 1995-1998 Jean-loup Gailly and Mark Adler
|
||||||
|
|
||||||
This software is provided 'as-is', without any express or implied
|
This software is provided 'as-is', without any express or implied
|
||||||
warranty. In no event will the authors be held liable for any damages
|
warranty. In no event will the authors be held liable for any damages
|
||||||
@ -87,7 +136,7 @@ Copyright notice:
|
|||||||
3. This notice may not be removed or altered from any source distribution.
|
3. This notice may not be removed or altered from any source distribution.
|
||||||
|
|
||||||
Jean-loup Gailly Mark Adler
|
Jean-loup Gailly Mark Adler
|
||||||
gzip@prep.ai.mit.edu madler@alumni.caltech.edu
|
jloup@gzip.org madler@alumni.caltech.edu
|
||||||
|
|
||||||
If you use the zlib library in a product, we would appreciate *not*
|
If you use the zlib library in a product, we would appreciate *not*
|
||||||
receiving lengthy legal documents to sign. The sources are provided
|
receiving lengthy legal documents to sign. The sources are provided
|
||||||
|
@ -1,9 +1,9 @@
|
|||||||
/* adler32.c -- compute the Adler-32 checksum of a data stream
|
/* adler32.c -- compute the Adler-32 checksum of a data stream
|
||||||
* Copyright (C) 1995-1996 Mark Adler
|
* Copyright (C) 1995-1998 Mark Adler
|
||||||
* For conditions of distribution and use, see copyright notice in zlib.h
|
* For conditions of distribution and use, see copyright notice in zlib.h
|
||||||
*/
|
*/
|
||||||
/* This file was modified since it was taken from the zlib distribution */
|
|
||||||
/* $Id: adler32.c,v 3.1 1998/03/28 03:36:10 ltabb Exp $ */
|
/* @(#) $Id: adler32.c,v 3.2 2001/06/30 23:37:49 leaf%mozilla.org Exp $ */
|
||||||
|
|
||||||
#include "zlib.h"
|
#include "zlib.h"
|
||||||
|
|
||||||
@ -18,7 +18,7 @@
|
|||||||
#define DO16(buf) DO8(buf,0); DO8(buf,8);
|
#define DO16(buf) DO8(buf,0); DO8(buf,8);
|
||||||
|
|
||||||
/* ========================================================================= */
|
/* ========================================================================= */
|
||||||
PR_PUBLIC_API(uLong) adler32(adler, buf, len)
|
uLong ZEXPORT adler32(adler, buf, len)
|
||||||
uLong adler;
|
uLong adler;
|
||||||
const Bytef *buf;
|
const Bytef *buf;
|
||||||
uInt len;
|
uInt len;
|
||||||
|
@ -1,29 +1,29 @@
|
|||||||
/* compress.c -- compress a memory buffer
|
/* compress.c -- compress a memory buffer
|
||||||
* Copyright (C) 1995-1996 Jean-loup Gailly.
|
* Copyright (C) 1995-1998 Jean-loup Gailly.
|
||||||
* For conditions of distribution and use, see copyright notice in zlib.h
|
* For conditions of distribution and use, see copyright notice in zlib.h
|
||||||
*/
|
*/
|
||||||
/* This file was modified since it was taken from the zlib distribution */
|
|
||||||
/* $Id: compress.c,v 3.1 1998/03/28 03:36:10 ltabb Exp $ */
|
/* @(#) $Id: compress.c,v 3.2 2001/06/30 23:37:50 leaf%mozilla.org Exp $ */
|
||||||
|
|
||||||
#include "zlib.h"
|
#include "zlib.h"
|
||||||
|
|
||||||
/* ===========================================================================
|
/* ===========================================================================
|
||||||
Compresses the source buffer into the destination buffer. sourceLen is
|
Compresses the source buffer into the destination buffer. The level
|
||||||
the byte length of the source buffer. Upon entry, destLen is the total
|
parameter has the same meaning as in deflateInit. sourceLen is the byte
|
||||||
size of the destination buffer, which must be at least 0.1% larger than
|
length of the source buffer. Upon entry, destLen is the total size of the
|
||||||
sourceLen plus 8 bytes. Upon exit, destLen is the actual size of the
|
destination buffer, which must be at least 0.1% larger than sourceLen plus
|
||||||
compressed buffer.
|
12 bytes. Upon exit, destLen is the actual size of the compressed buffer.
|
||||||
This function can be used to compress a whole file at once if the
|
|
||||||
input file is mmap'ed.
|
compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough
|
||||||
compress returns Z_OK if success, Z_MEM_ERROR if there was not
|
memory, Z_BUF_ERROR if there was not enough room in the output buffer,
|
||||||
enough memory, Z_BUF_ERROR if there was not enough room in the output
|
Z_STREAM_ERROR if the level parameter is invalid.
|
||||||
buffer.
|
|
||||||
*/
|
*/
|
||||||
PR_PUBLIC_API(int) compress (dest, destLen, source, sourceLen)
|
int ZEXPORT compress2 (dest, destLen, source, sourceLen, level)
|
||||||
Bytef *dest;
|
Bytef *dest;
|
||||||
uLongf *destLen;
|
uLongf *destLen;
|
||||||
const Bytef *source;
|
const Bytef *source;
|
||||||
uLong sourceLen;
|
uLong sourceLen;
|
||||||
|
int level;
|
||||||
{
|
{
|
||||||
z_stream stream;
|
z_stream stream;
|
||||||
int err;
|
int err;
|
||||||
@ -42,7 +42,7 @@ PR_PUBLIC_API(int) compress (dest, destLen, source, sourceLen)
|
|||||||
stream.zfree = (free_func)0;
|
stream.zfree = (free_func)0;
|
||||||
stream.opaque = (voidpf)0;
|
stream.opaque = (voidpf)0;
|
||||||
|
|
||||||
err = deflateInit(&stream, Z_DEFAULT_COMPRESSION);
|
err = deflateInit(&stream, level);
|
||||||
if (err != Z_OK) return err;
|
if (err != Z_OK) return err;
|
||||||
|
|
||||||
err = deflate(&stream, Z_FINISH);
|
err = deflate(&stream, Z_FINISH);
|
||||||
@ -55,3 +55,14 @@ PR_PUBLIC_API(int) compress (dest, destLen, source, sourceLen)
|
|||||||
err = deflateEnd(&stream);
|
err = deflateEnd(&stream);
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* ===========================================================================
|
||||||
|
*/
|
||||||
|
int ZEXPORT compress (dest, destLen, source, sourceLen)
|
||||||
|
Bytef *dest;
|
||||||
|
uLongf *destLen;
|
||||||
|
const Bytef *source;
|
||||||
|
uLong sourceLen;
|
||||||
|
{
|
||||||
|
return compress2(dest, destLen, source, sourceLen, Z_DEFAULT_COMPRESSION);
|
||||||
|
}
|
||||||
|
@ -1,9 +1,9 @@
|
|||||||
/* crc32.c -- compute the CRC-32 of a data stream
|
/* crc32.c -- compute the CRC-32 of a data stream
|
||||||
* Copyright (C) 1995-1996 Mark Adler
|
* Copyright (C) 1995-1998 Mark Adler
|
||||||
* For conditions of distribution and use, see copyright notice in zlib.h
|
* For conditions of distribution and use, see copyright notice in zlib.h
|
||||||
*/
|
*/
|
||||||
/* This file was modified since it was taken from the zlib distribution */
|
|
||||||
/* $Id: crc32.c,v 3.1 1998/03/28 03:36:10 ltabb Exp $ */
|
/* @(#) $Id: crc32.c,v 3.2 2001/06/30 23:37:51 leaf%mozilla.org Exp $ */
|
||||||
|
|
||||||
#include "zlib.h"
|
#include "zlib.h"
|
||||||
|
|
||||||
@ -45,7 +45,7 @@ local void make_crc_table()
|
|||||||
int n, k;
|
int n, k;
|
||||||
uLong poly; /* polynomial exclusive-or pattern */
|
uLong poly; /* polynomial exclusive-or pattern */
|
||||||
/* terms of polynomial defining this crc (except x^32): */
|
/* terms of polynomial defining this crc (except x^32): */
|
||||||
static Byte p[] = {0,1,2,4,5,7,8,10,11,12,16,22,23,26};
|
static const Byte p[] = {0,1,2,4,5,7,8,10,11,12,16,22,23,26};
|
||||||
|
|
||||||
/* make exclusive-or pattern from polynomial (0xedb88320L) */
|
/* make exclusive-or pattern from polynomial (0xedb88320L) */
|
||||||
poly = 0L;
|
poly = 0L;
|
||||||
@ -65,58 +65,58 @@ local void make_crc_table()
|
|||||||
/* ========================================================================
|
/* ========================================================================
|
||||||
* Table of CRC-32's of all single-byte values (made by make_crc_table)
|
* Table of CRC-32's of all single-byte values (made by make_crc_table)
|
||||||
*/
|
*/
|
||||||
local uLongf crc_table[256] = {
|
local const uLongf crc_table[256] = {
|
||||||
0x00000000UL, 0x77073096UL, 0xee0e612cUL, 0x990951baUL, 0x076dc419UL,
|
0x00000000L, 0x77073096L, 0xee0e612cL, 0x990951baL, 0x076dc419L,
|
||||||
0x706af48fUL, 0xe963a535UL, 0x9e6495a3UL, 0x0edb8832UL, 0x79dcb8a4UL,
|
0x706af48fL, 0xe963a535L, 0x9e6495a3L, 0x0edb8832L, 0x79dcb8a4L,
|
||||||
0xe0d5e91eUL, 0x97d2d988UL, 0x09b64c2bUL, 0x7eb17cbdUL, 0xe7b82d07UL,
|
0xe0d5e91eL, 0x97d2d988L, 0x09b64c2bL, 0x7eb17cbdL, 0xe7b82d07L,
|
||||||
0x90bf1d91UL, 0x1db71064UL, 0x6ab020f2UL, 0xf3b97148UL, 0x84be41deUL,
|
0x90bf1d91L, 0x1db71064L, 0x6ab020f2L, 0xf3b97148L, 0x84be41deL,
|
||||||
0x1adad47dUL, 0x6ddde4ebUL, 0xf4d4b551UL, 0x83d385c7UL, 0x136c9856UL,
|
0x1adad47dL, 0x6ddde4ebL, 0xf4d4b551L, 0x83d385c7L, 0x136c9856L,
|
||||||
0x646ba8c0UL, 0xfd62f97aUL, 0x8a65c9ecUL, 0x14015c4fUL, 0x63066cd9UL,
|
0x646ba8c0L, 0xfd62f97aL, 0x8a65c9ecL, 0x14015c4fL, 0x63066cd9L,
|
||||||
0xfa0f3d63UL, 0x8d080df5UL, 0x3b6e20c8UL, 0x4c69105eUL, 0xd56041e4UL,
|
0xfa0f3d63L, 0x8d080df5L, 0x3b6e20c8L, 0x4c69105eL, 0xd56041e4L,
|
||||||
0xa2677172UL, 0x3c03e4d1UL, 0x4b04d447UL, 0xd20d85fdUL, 0xa50ab56bUL,
|
0xa2677172L, 0x3c03e4d1L, 0x4b04d447L, 0xd20d85fdL, 0xa50ab56bL,
|
||||||
0x35b5a8faUL, 0x42b2986cUL, 0xdbbbc9d6UL, 0xacbcf940UL, 0x32d86ce3UL,
|
0x35b5a8faL, 0x42b2986cL, 0xdbbbc9d6L, 0xacbcf940L, 0x32d86ce3L,
|
||||||
0x45df5c75UL, 0xdcd60dcfUL, 0xabd13d59UL, 0x26d930acUL, 0x51de003aUL,
|
0x45df5c75L, 0xdcd60dcfL, 0xabd13d59L, 0x26d930acL, 0x51de003aL,
|
||||||
0xc8d75180UL, 0xbfd06116UL, 0x21b4f4b5UL, 0x56b3c423UL, 0xcfba9599UL,
|
0xc8d75180L, 0xbfd06116L, 0x21b4f4b5L, 0x56b3c423L, 0xcfba9599L,
|
||||||
0xb8bda50fUL, 0x2802b89eUL, 0x5f058808UL, 0xc60cd9b2UL, 0xb10be924UL,
|
0xb8bda50fL, 0x2802b89eL, 0x5f058808L, 0xc60cd9b2L, 0xb10be924L,
|
||||||
0x2f6f7c87UL, 0x58684c11UL, 0xc1611dabUL, 0xb6662d3dUL, 0x76dc4190UL,
|
0x2f6f7c87L, 0x58684c11L, 0xc1611dabL, 0xb6662d3dL, 0x76dc4190L,
|
||||||
0x01db7106UL, 0x98d220bcUL, 0xefd5102aUL, 0x71b18589UL, 0x06b6b51fUL,
|
0x01db7106L, 0x98d220bcL, 0xefd5102aL, 0x71b18589L, 0x06b6b51fL,
|
||||||
0x9fbfe4a5UL, 0xe8b8d433UL, 0x7807c9a2UL, 0x0f00f934UL, 0x9609a88eUL,
|
0x9fbfe4a5L, 0xe8b8d433L, 0x7807c9a2L, 0x0f00f934L, 0x9609a88eL,
|
||||||
0xe10e9818UL, 0x7f6a0dbbUL, 0x086d3d2dUL, 0x91646c97UL, 0xe6635c01UL,
|
0xe10e9818L, 0x7f6a0dbbL, 0x086d3d2dL, 0x91646c97L, 0xe6635c01L,
|
||||||
0x6b6b51f4UL, 0x1c6c6162UL, 0x856530d8UL, 0xf262004eUL, 0x6c0695edUL,
|
0x6b6b51f4L, 0x1c6c6162L, 0x856530d8L, 0xf262004eL, 0x6c0695edL,
|
||||||
0x1b01a57bUL, 0x8208f4c1UL, 0xf50fc457UL, 0x65b0d9c6UL, 0x12b7e950UL,
|
0x1b01a57bL, 0x8208f4c1L, 0xf50fc457L, 0x65b0d9c6L, 0x12b7e950L,
|
||||||
0x8bbeb8eaUL, 0xfcb9887cUL, 0x62dd1ddfUL, 0x15da2d49UL, 0x8cd37cf3UL,
|
0x8bbeb8eaL, 0xfcb9887cL, 0x62dd1ddfL, 0x15da2d49L, 0x8cd37cf3L,
|
||||||
0xfbd44c65UL, 0x4db26158UL, 0x3ab551ceUL, 0xa3bc0074UL, 0xd4bb30e2UL,
|
0xfbd44c65L, 0x4db26158L, 0x3ab551ceL, 0xa3bc0074L, 0xd4bb30e2L,
|
||||||
0x4adfa541UL, 0x3dd895d7UL, 0xa4d1c46dUL, 0xd3d6f4fbUL, 0x4369e96aUL,
|
0x4adfa541L, 0x3dd895d7L, 0xa4d1c46dL, 0xd3d6f4fbL, 0x4369e96aL,
|
||||||
0x346ed9fcUL, 0xad678846UL, 0xda60b8d0UL, 0x44042d73UL, 0x33031de5UL,
|
0x346ed9fcL, 0xad678846L, 0xda60b8d0L, 0x44042d73L, 0x33031de5L,
|
||||||
0xaa0a4c5fUL, 0xdd0d7cc9UL, 0x5005713cUL, 0x270241aaUL, 0xbe0b1010UL,
|
0xaa0a4c5fL, 0xdd0d7cc9L, 0x5005713cL, 0x270241aaL, 0xbe0b1010L,
|
||||||
0xc90c2086UL, 0x5768b525UL, 0x206f85b3UL, 0xb966d409UL, 0xce61e49fUL,
|
0xc90c2086L, 0x5768b525L, 0x206f85b3L, 0xb966d409L, 0xce61e49fL,
|
||||||
0x5edef90eUL, 0x29d9c998UL, 0xb0d09822UL, 0xc7d7a8b4UL, 0x59b33d17UL,
|
0x5edef90eL, 0x29d9c998L, 0xb0d09822L, 0xc7d7a8b4L, 0x59b33d17L,
|
||||||
0x2eb40d81UL, 0xb7bd5c3bUL, 0xc0ba6cadUL, 0xedb88320UL, 0x9abfb3b6UL,
|
0x2eb40d81L, 0xb7bd5c3bL, 0xc0ba6cadL, 0xedb88320L, 0x9abfb3b6L,
|
||||||
0x03b6e20cUL, 0x74b1d29aUL, 0xead54739UL, 0x9dd277afUL, 0x04db2615UL,
|
0x03b6e20cL, 0x74b1d29aL, 0xead54739L, 0x9dd277afL, 0x04db2615L,
|
||||||
0x73dc1683UL, 0xe3630b12UL, 0x94643b84UL, 0x0d6d6a3eUL, 0x7a6a5aa8UL,
|
0x73dc1683L, 0xe3630b12L, 0x94643b84L, 0x0d6d6a3eL, 0x7a6a5aa8L,
|
||||||
0xe40ecf0bUL, 0x9309ff9dUL, 0x0a00ae27UL, 0x7d079eb1UL, 0xf00f9344UL,
|
0xe40ecf0bL, 0x9309ff9dL, 0x0a00ae27L, 0x7d079eb1L, 0xf00f9344L,
|
||||||
0x8708a3d2UL, 0x1e01f268UL, 0x6906c2feUL, 0xf762575dUL, 0x806567cbUL,
|
0x8708a3d2L, 0x1e01f268L, 0x6906c2feL, 0xf762575dL, 0x806567cbL,
|
||||||
0x196c3671UL, 0x6e6b06e7UL, 0xfed41b76UL, 0x89d32be0UL, 0x10da7a5aUL,
|
0x196c3671L, 0x6e6b06e7L, 0xfed41b76L, 0x89d32be0L, 0x10da7a5aL,
|
||||||
0x67dd4accUL, 0xf9b9df6fUL, 0x8ebeeff9UL, 0x17b7be43UL, 0x60b08ed5UL,
|
0x67dd4accL, 0xf9b9df6fL, 0x8ebeeff9L, 0x17b7be43L, 0x60b08ed5L,
|
||||||
0xd6d6a3e8UL, 0xa1d1937eUL, 0x38d8c2c4UL, 0x4fdff252UL, 0xd1bb67f1UL,
|
0xd6d6a3e8L, 0xa1d1937eL, 0x38d8c2c4L, 0x4fdff252L, 0xd1bb67f1L,
|
||||||
0xa6bc5767UL, 0x3fb506ddUL, 0x48b2364bUL, 0xd80d2bdaUL, 0xaf0a1b4cUL,
|
0xa6bc5767L, 0x3fb506ddL, 0x48b2364bL, 0xd80d2bdaL, 0xaf0a1b4cL,
|
||||||
0x36034af6UL, 0x41047a60UL, 0xdf60efc3UL, 0xa867df55UL, 0x316e8eefUL,
|
0x36034af6L, 0x41047a60L, 0xdf60efc3L, 0xa867df55L, 0x316e8eefL,
|
||||||
0x4669be79UL, 0xcb61b38cUL, 0xbc66831aUL, 0x256fd2a0UL, 0x5268e236UL,
|
0x4669be79L, 0xcb61b38cL, 0xbc66831aL, 0x256fd2a0L, 0x5268e236L,
|
||||||
0xcc0c7795UL, 0xbb0b4703UL, 0x220216b9UL, 0x5505262fUL, 0xc5ba3bbeUL,
|
0xcc0c7795L, 0xbb0b4703L, 0x220216b9L, 0x5505262fL, 0xc5ba3bbeL,
|
||||||
0xb2bd0b28UL, 0x2bb45a92UL, 0x5cb36a04UL, 0xc2d7ffa7UL, 0xb5d0cf31UL,
|
0xb2bd0b28L, 0x2bb45a92L, 0x5cb36a04L, 0xc2d7ffa7L, 0xb5d0cf31L,
|
||||||
0x2cd99e8bUL, 0x5bdeae1dUL, 0x9b64c2b0UL, 0xec63f226UL, 0x756aa39cUL,
|
0x2cd99e8bL, 0x5bdeae1dL, 0x9b64c2b0L, 0xec63f226L, 0x756aa39cL,
|
||||||
0x026d930aUL, 0x9c0906a9UL, 0xeb0e363fUL, 0x72076785UL, 0x05005713UL,
|
0x026d930aL, 0x9c0906a9L, 0xeb0e363fL, 0x72076785L, 0x05005713L,
|
||||||
0x95bf4a82UL, 0xe2b87a14UL, 0x7bb12baeUL, 0x0cb61b38UL, 0x92d28e9bUL,
|
0x95bf4a82L, 0xe2b87a14L, 0x7bb12baeL, 0x0cb61b38L, 0x92d28e9bL,
|
||||||
0xe5d5be0dUL, 0x7cdcefb7UL, 0x0bdbdf21UL, 0x86d3d2d4UL, 0xf1d4e242UL,
|
0xe5d5be0dL, 0x7cdcefb7L, 0x0bdbdf21L, 0x86d3d2d4L, 0xf1d4e242L,
|
||||||
0x68ddb3f8UL, 0x1fda836eUL, 0x81be16cdUL, 0xf6b9265bUL, 0x6fb077e1UL,
|
0x68ddb3f8L, 0x1fda836eL, 0x81be16cdL, 0xf6b9265bL, 0x6fb077e1L,
|
||||||
0x18b74777UL, 0x88085ae6UL, 0xff0f6a70UL, 0x66063bcaUL, 0x11010b5cUL,
|
0x18b74777L, 0x88085ae6L, 0xff0f6a70L, 0x66063bcaL, 0x11010b5cL,
|
||||||
0x8f659effUL, 0xf862ae69UL, 0x616bffd3UL, 0x166ccf45UL, 0xa00ae278UL,
|
0x8f659effL, 0xf862ae69L, 0x616bffd3L, 0x166ccf45L, 0xa00ae278L,
|
||||||
0xd70dd2eeUL, 0x4e048354UL, 0x3903b3c2UL, 0xa7672661UL, 0xd06016f7UL,
|
0xd70dd2eeL, 0x4e048354L, 0x3903b3c2L, 0xa7672661L, 0xd06016f7L,
|
||||||
0x4969474dUL, 0x3e6e77dbUL, 0xaed16a4aUL, 0xd9d65adcUL, 0x40df0b66UL,
|
0x4969474dL, 0x3e6e77dbL, 0xaed16a4aL, 0xd9d65adcL, 0x40df0b66L,
|
||||||
0x37d83bf0UL, 0xa9bcae53UL, 0xdebb9ec5UL, 0x47b2cf7fUL, 0x30b5ffe9UL,
|
0x37d83bf0L, 0xa9bcae53L, 0xdebb9ec5L, 0x47b2cf7fL, 0x30b5ffe9L,
|
||||||
0xbdbdf21cUL, 0xcabac28aUL, 0x53b39330UL, 0x24b4a3a6UL, 0xbad03605UL,
|
0xbdbdf21cL, 0xcabac28aL, 0x53b39330L, 0x24b4a3a6L, 0xbad03605L,
|
||||||
0xcdd70693UL, 0x54de5729UL, 0x23d967bfUL, 0xb3667a2eUL, 0xc4614ab8UL,
|
0xcdd70693L, 0x54de5729L, 0x23d967bfL, 0xb3667a2eL, 0xc4614ab8L,
|
||||||
0x5d681b02UL, 0x2a6f2b94UL, 0xb40bbe37UL, 0xc30c8ea1UL, 0x5a05df1bUL,
|
0x5d681b02L, 0x2a6f2b94L, 0xb40bbe37L, 0xc30c8ea1L, 0x5a05df1bL,
|
||||||
0x2d02ef8dL
|
0x2d02ef8dL
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
@ -124,12 +124,12 @@ local uLongf crc_table[256] = {
|
|||||||
/* =========================================================================
|
/* =========================================================================
|
||||||
* This function can be used by asm versions of crc32()
|
* This function can be used by asm versions of crc32()
|
||||||
*/
|
*/
|
||||||
uLongf *get_crc_table()
|
const uLongf * ZEXPORT get_crc_table()
|
||||||
{
|
{
|
||||||
#ifdef DYNAMIC_CRC_TABLE
|
#ifdef DYNAMIC_CRC_TABLE
|
||||||
if (crc_table_empty) make_crc_table();
|
if (crc_table_empty) make_crc_table();
|
||||||
#endif
|
#endif
|
||||||
return (uLongf *)crc_table;
|
return (const uLongf *)crc_table;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ========================================================================= */
|
/* ========================================================================= */
|
||||||
@ -139,7 +139,7 @@ uLongf *get_crc_table()
|
|||||||
#define DO8(buf) DO4(buf); DO4(buf);
|
#define DO8(buf) DO4(buf); DO4(buf);
|
||||||
|
|
||||||
/* ========================================================================= */
|
/* ========================================================================= */
|
||||||
PR_PUBLIC_API(uLong) crc32(crc, buf, len)
|
uLong ZEXPORT crc32(crc, buf, len)
|
||||||
uLong crc;
|
uLong crc;
|
||||||
const Bytef *buf;
|
const Bytef *buf;
|
||||||
uInt len;
|
uInt len;
|
||||||
@ -149,7 +149,7 @@ PR_PUBLIC_API(uLong) crc32(crc, buf, len)
|
|||||||
if (crc_table_empty)
|
if (crc_table_empty)
|
||||||
make_crc_table();
|
make_crc_table();
|
||||||
#endif
|
#endif
|
||||||
crc = crc ^ 0xffffffffUL;
|
crc = crc ^ 0xffffffffL;
|
||||||
while (len >= 8)
|
while (len >= 8)
|
||||||
{
|
{
|
||||||
DO8(buf);
|
DO8(buf);
|
||||||
@ -158,5 +158,5 @@ PR_PUBLIC_API(uLong) crc32(crc, buf, len)
|
|||||||
if (len) do {
|
if (len) do {
|
||||||
DO1(buf);
|
DO1(buf);
|
||||||
} while (--len);
|
} while (--len);
|
||||||
return crc ^ 0xffffffffUL;
|
return crc ^ 0xffffffffL;
|
||||||
}
|
}
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
/* deflate.c -- compress data using the deflation algorithm
|
/* deflate.c -- compress data using the deflation algorithm
|
||||||
* Copyright (C) 1995-1996 Jean-loup Gailly.
|
* Copyright (C) 1995-1998 Jean-loup Gailly.
|
||||||
* For conditions of distribution and use, see copyright notice in zlib.h
|
* For conditions of distribution and use, see copyright notice in zlib.h
|
||||||
*/
|
*/
|
||||||
/* This file was modified since it was taken from the zlib distribution */
|
|
||||||
/*
|
/*
|
||||||
* ALGORITHM
|
* ALGORITHM
|
||||||
*
|
*
|
||||||
@ -36,8 +36,8 @@
|
|||||||
*
|
*
|
||||||
* REFERENCES
|
* REFERENCES
|
||||||
*
|
*
|
||||||
* Deutsch, L.P.,"'Deflate' Compressed Data Format Specification".
|
* Deutsch, L.P.,"DEFLATE Compressed Data Format Specification".
|
||||||
* Available in ftp.uu.net:/pub/archiving/zip/doc/deflate-1.1.doc
|
* Available in ftp://ds.internic.net/rfc/rfc1951.txt
|
||||||
*
|
*
|
||||||
* A description of the Rabin and Karp algorithm is given in the book
|
* A description of the Rabin and Karp algorithm is given in the book
|
||||||
* "Algorithms" by R. Sedgewick, Addison-Wesley, p252.
|
* "Algorithms" by R. Sedgewick, Addison-Wesley, p252.
|
||||||
@ -47,11 +47,12 @@
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* $Id: deflate.c,v 3.1 1998/03/28 03:36:10 ltabb Exp $ */
|
/* @(#) $Id: deflate.c,v 3.2 2001/06/30 23:37:51 leaf%mozilla.org Exp $ */
|
||||||
|
|
||||||
#include "deflate.h"
|
#include "deflate.h"
|
||||||
|
|
||||||
char deflate_copyright[] = " deflate 1.0.4 Copyright 1995-1996 Jean-loup Gailly ";
|
const char deflate_copyright[] =
|
||||||
|
" deflate 1.1.3 Copyright 1995-1998 Jean-loup Gailly ";
|
||||||
/*
|
/*
|
||||||
If you use the zlib library in a product, an acknowledgment is welcome
|
If you use the zlib library in a product, an acknowledgment is welcome
|
||||||
in the documentation of your product. If for some reason you cannot
|
in the documentation of your product. If for some reason you cannot
|
||||||
@ -77,15 +78,17 @@ local block_state deflate_stored OF((deflate_state *s, int flush));
|
|||||||
local block_state deflate_fast OF((deflate_state *s, int flush));
|
local block_state deflate_fast OF((deflate_state *s, int flush));
|
||||||
local block_state deflate_slow OF((deflate_state *s, int flush));
|
local block_state deflate_slow OF((deflate_state *s, int flush));
|
||||||
local void lm_init OF((deflate_state *s));
|
local void lm_init OF((deflate_state *s));
|
||||||
local uInt longest_match OF((deflate_state *s, IPos cur_match));
|
|
||||||
local void putShortMSB OF((deflate_state *s, uInt b));
|
local void putShortMSB OF((deflate_state *s, uInt b));
|
||||||
local void flush_pending OF((z_streamp strm));
|
local void flush_pending OF((z_streamp strm));
|
||||||
local int read_buf OF((z_streamp strm, charf *buf, unsigned size));
|
local int read_buf OF((z_streamp strm, Bytef *buf, unsigned size));
|
||||||
#ifdef ASMV
|
#ifdef ASMV
|
||||||
void match_init OF((void)); /* asm code initialization */
|
void match_init OF((void)); /* asm code initialization */
|
||||||
|
uInt longest_match OF((deflate_state *s, IPos cur_match));
|
||||||
|
#else
|
||||||
|
local uInt longest_match OF((deflate_state *s, IPos cur_match));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef DEBUG_NEVER
|
#ifdef DEBUG
|
||||||
local void check_match OF((deflate_state *s, IPos start, IPos match,
|
local void check_match OF((deflate_state *s, IPos start, IPos match,
|
||||||
int length));
|
int length));
|
||||||
#endif
|
#endif
|
||||||
@ -120,7 +123,7 @@ typedef struct config_s {
|
|||||||
compress_func func;
|
compress_func func;
|
||||||
} config;
|
} config;
|
||||||
|
|
||||||
local config configuration_table[10] = {
|
local const config configuration_table[10] = {
|
||||||
/* good lazy nice chain */
|
/* good lazy nice chain */
|
||||||
/* 0 */ {0, 0, 0, 0, deflate_stored}, /* store only */
|
/* 0 */ {0, 0, 0, 0, deflate_stored}, /* store only */
|
||||||
/* 1 */ {4, 4, 8, 4, deflate_fast}, /* maximum speed, no lazy matches */
|
/* 1 */ {4, 4, 8, 4, deflate_fast}, /* maximum speed, no lazy matches */
|
||||||
@ -157,14 +160,23 @@ struct static_tree_desc_s {int dummy;}; /* for buggy compilers */
|
|||||||
* Insert string str in the dictionary and set match_head to the previous head
|
* Insert string str in the dictionary and set match_head to the previous head
|
||||||
* of the hash chain (the most recent string with same hash key). Return
|
* of the hash chain (the most recent string with same hash key). Return
|
||||||
* the previous length of the hash chain.
|
* the previous length of the hash chain.
|
||||||
|
* If this file is compiled with -DFASTEST, the compression level is forced
|
||||||
|
* to 1, and no hash chains are maintained.
|
||||||
* IN assertion: all calls to to INSERT_STRING are made with consecutive
|
* IN assertion: all calls to to INSERT_STRING are made with consecutive
|
||||||
* input characters and the first MIN_MATCH bytes of str are valid
|
* input characters and the first MIN_MATCH bytes of str are valid
|
||||||
* (except for the last MIN_MATCH-1 bytes of the input file).
|
* (except for the last MIN_MATCH-1 bytes of the input file).
|
||||||
*/
|
*/
|
||||||
|
#ifdef FASTEST
|
||||||
|
#define INSERT_STRING(s, str, match_head) \
|
||||||
|
(UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]), \
|
||||||
|
match_head = s->head[s->ins_h], \
|
||||||
|
s->head[s->ins_h] = (Pos)(str))
|
||||||
|
#else
|
||||||
#define INSERT_STRING(s, str, match_head) \
|
#define INSERT_STRING(s, str, match_head) \
|
||||||
(UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]), \
|
(UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]), \
|
||||||
s->prev[(str) & s->w_mask] = match_head = s->head[s->ins_h], \
|
s->prev[(str) & s->w_mask] = match_head = s->head[s->ins_h], \
|
||||||
s->head[s->ins_h] = (Pos)(str))
|
s->head[s->ins_h] = (Pos)(str))
|
||||||
|
#endif
|
||||||
|
|
||||||
/* ===========================================================================
|
/* ===========================================================================
|
||||||
* Initialize the hash table (avoiding 64K overflow for 16 bit systems).
|
* Initialize the hash table (avoiding 64K overflow for 16 bit systems).
|
||||||
@ -172,10 +184,10 @@ struct static_tree_desc_s {int dummy;}; /* for buggy compilers */
|
|||||||
*/
|
*/
|
||||||
#define CLEAR_HASH(s) \
|
#define CLEAR_HASH(s) \
|
||||||
s->head[s->hash_size-1] = NIL; \
|
s->head[s->hash_size-1] = NIL; \
|
||||||
zmemzero((charf *)s->head, (unsigned)(s->hash_size-1)*sizeof(*s->head));
|
zmemzero((Bytef *)s->head, (unsigned)(s->hash_size-1)*sizeof(*s->head));
|
||||||
|
|
||||||
/* ========================================================================= */
|
/* ========================================================================= */
|
||||||
PR_PUBLIC_API(int) deflateInit_(strm, level, version, stream_size)
|
int ZEXPORT deflateInit_(strm, level, version, stream_size)
|
||||||
z_streamp strm;
|
z_streamp strm;
|
||||||
int level;
|
int level;
|
||||||
const char *version;
|
const char *version;
|
||||||
@ -187,7 +199,7 @@ PR_PUBLIC_API(int) deflateInit_(strm, level, version, stream_size)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* ========================================================================= */
|
/* ========================================================================= */
|
||||||
PR_PUBLIC_API(int) deflateInit2_(strm, level, method, windowBits, memLevel, strategy,
|
int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy,
|
||||||
version, stream_size)
|
version, stream_size)
|
||||||
z_streamp strm;
|
z_streamp strm;
|
||||||
int level;
|
int level;
|
||||||
@ -200,13 +212,14 @@ PR_PUBLIC_API(int) deflateInit2_(strm, level, method, windowBits, memLevel, stra
|
|||||||
{
|
{
|
||||||
deflate_state *s;
|
deflate_state *s;
|
||||||
int noheader = 0;
|
int noheader = 0;
|
||||||
|
static const char* my_version = ZLIB_VERSION;
|
||||||
|
|
||||||
ushf *overlay;
|
ushf *overlay;
|
||||||
/* We overlay pending_buf and d_buf+l_buf. This works since the average
|
/* We overlay pending_buf and d_buf+l_buf. This works since the average
|
||||||
* output size for (length,distance) codes is <= 24 bits.
|
* output size for (length,distance) codes is <= 24 bits.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (version == Z_NULL || version[0] != ZLIB_VERSION[0] ||
|
if (version == Z_NULL || version[0] != my_version[0] ||
|
||||||
stream_size != sizeof(z_stream)) {
|
stream_size != sizeof(z_stream)) {
|
||||||
return Z_VERSION_ERROR;
|
return Z_VERSION_ERROR;
|
||||||
}
|
}
|
||||||
@ -220,6 +233,9 @@ PR_PUBLIC_API(int) deflateInit2_(strm, level, method, windowBits, memLevel, stra
|
|||||||
if (strm->zfree == Z_NULL) strm->zfree = zcfree;
|
if (strm->zfree == Z_NULL) strm->zfree = zcfree;
|
||||||
|
|
||||||
if (level == Z_DEFAULT_COMPRESSION) level = 6;
|
if (level == Z_DEFAULT_COMPRESSION) level = 6;
|
||||||
|
#ifdef FASTEST
|
||||||
|
level = 1;
|
||||||
|
#endif
|
||||||
|
|
||||||
if (windowBits < 0) { /* undocumented feature: suppress zlib header */
|
if (windowBits < 0) { /* undocumented feature: suppress zlib header */
|
||||||
noheader = 1;
|
noheader = 1;
|
||||||
@ -253,6 +269,7 @@ PR_PUBLIC_API(int) deflateInit2_(strm, level, method, windowBits, memLevel, stra
|
|||||||
|
|
||||||
overlay = (ushf *) ZALLOC(strm, s->lit_bufsize, sizeof(ush)+2);
|
overlay = (ushf *) ZALLOC(strm, s->lit_bufsize, sizeof(ush)+2);
|
||||||
s->pending_buf = (uchf *) overlay;
|
s->pending_buf = (uchf *) overlay;
|
||||||
|
s->pending_buf_size = (ulg)s->lit_bufsize * (sizeof(ush)+2L);
|
||||||
|
|
||||||
if (s->window == Z_NULL || s->prev == Z_NULL || s->head == Z_NULL ||
|
if (s->window == Z_NULL || s->prev == Z_NULL || s->head == Z_NULL ||
|
||||||
s->pending_buf == Z_NULL) {
|
s->pending_buf == Z_NULL) {
|
||||||
@ -271,7 +288,7 @@ PR_PUBLIC_API(int) deflateInit2_(strm, level, method, windowBits, memLevel, stra
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* ========================================================================= */
|
/* ========================================================================= */
|
||||||
PR_PUBLIC_API(int) deflateSetDictionary (strm, dictionary, dictLength)
|
int ZEXPORT deflateSetDictionary (strm, dictionary, dictLength)
|
||||||
z_streamp strm;
|
z_streamp strm;
|
||||||
const Bytef *dictionary;
|
const Bytef *dictionary;
|
||||||
uInt dictLength;
|
uInt dictLength;
|
||||||
@ -290,9 +307,11 @@ PR_PUBLIC_API(int) deflateSetDictionary (strm, dictionary, dictLength)
|
|||||||
if (length < MIN_MATCH) return Z_OK;
|
if (length < MIN_MATCH) return Z_OK;
|
||||||
if (length > MAX_DIST(s)) {
|
if (length > MAX_DIST(s)) {
|
||||||
length = MAX_DIST(s);
|
length = MAX_DIST(s);
|
||||||
dictionary += dictLength - length;
|
#ifndef USE_DICT_HEAD
|
||||||
|
dictionary += dictLength - length; /* use the tail of the dictionary */
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
zmemcpy((charf *)s->window, dictionary, length);
|
zmemcpy(s->window, dictionary, length);
|
||||||
s->strstart = length;
|
s->strstart = length;
|
||||||
s->block_start = (long)length;
|
s->block_start = (long)length;
|
||||||
|
|
||||||
@ -310,7 +329,7 @@ PR_PUBLIC_API(int) deflateSetDictionary (strm, dictionary, dictLength)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* ========================================================================= */
|
/* ========================================================================= */
|
||||||
PR_PUBLIC_API(int) deflateReset (strm)
|
int ZEXPORT deflateReset (strm)
|
||||||
z_streamp strm;
|
z_streamp strm;
|
||||||
{
|
{
|
||||||
deflate_state *s;
|
deflate_state *s;
|
||||||
@ -340,7 +359,7 @@ PR_PUBLIC_API(int) deflateReset (strm)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* ========================================================================= */
|
/* ========================================================================= */
|
||||||
PR_PUBLIC_API(int) deflateParams(strm, level, strategy)
|
int ZEXPORT deflateParams(strm, level, strategy)
|
||||||
z_streamp strm;
|
z_streamp strm;
|
||||||
int level;
|
int level;
|
||||||
int strategy;
|
int strategy;
|
||||||
@ -414,7 +433,7 @@ local void flush_pending(strm)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* ========================================================================= */
|
/* ========================================================================= */
|
||||||
PR_PUBLIC_API(int) deflate (strm, flush)
|
int ZEXPORT deflate (strm, flush)
|
||||||
z_streamp strm;
|
z_streamp strm;
|
||||||
int flush;
|
int flush;
|
||||||
{
|
{
|
||||||
@ -548,42 +567,87 @@ PR_PUBLIC_API(int) deflate (strm, flush)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* ========================================================================= */
|
/* ========================================================================= */
|
||||||
PR_PUBLIC_API(int) deflateEnd (strm)
|
int ZEXPORT deflateEnd (strm)
|
||||||
z_streamp strm;
|
z_streamp strm;
|
||||||
{
|
{
|
||||||
int status;
|
int status;
|
||||||
|
|
||||||
if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;
|
if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;
|
||||||
|
|
||||||
|
status = strm->state->status;
|
||||||
|
if (status != INIT_STATE && status != BUSY_STATE &&
|
||||||
|
status != FINISH_STATE) {
|
||||||
|
return Z_STREAM_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
/* Deallocate in reverse order of allocations: */
|
/* Deallocate in reverse order of allocations: */
|
||||||
TRY_FREE(strm, strm->state->pending_buf);
|
TRY_FREE(strm, strm->state->pending_buf);
|
||||||
TRY_FREE(strm, strm->state->head);
|
TRY_FREE(strm, strm->state->head);
|
||||||
TRY_FREE(strm, strm->state->prev);
|
TRY_FREE(strm, strm->state->prev);
|
||||||
TRY_FREE(strm, strm->state->window);
|
TRY_FREE(strm, strm->state->window);
|
||||||
|
|
||||||
status = strm->state->status;
|
|
||||||
ZFREE(strm, strm->state);
|
ZFREE(strm, strm->state);
|
||||||
strm->state = Z_NULL;
|
strm->state = Z_NULL;
|
||||||
|
|
||||||
return status == BUSY_STATE ? Z_DATA_ERROR : Z_OK;
|
return status == BUSY_STATE ? Z_DATA_ERROR : Z_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ========================================================================= */
|
/* =========================================================================
|
||||||
PR_PUBLIC_API(int) deflateCopy (dest, source)
|
* Copy the source state to the destination state.
|
||||||
|
* To simplify the source, this is not supported for 16-bit MSDOS (which
|
||||||
|
* doesn't have enough memory anyway to duplicate compression states).
|
||||||
|
*/
|
||||||
|
int ZEXPORT deflateCopy (dest, source)
|
||||||
z_streamp dest;
|
z_streamp dest;
|
||||||
z_streamp source;
|
z_streamp source;
|
||||||
{
|
{
|
||||||
|
#ifdef MAXSEG_64K
|
||||||
|
return Z_STREAM_ERROR;
|
||||||
|
#else
|
||||||
|
deflate_state *ds;
|
||||||
|
deflate_state *ss;
|
||||||
|
ushf *overlay;
|
||||||
|
|
||||||
|
|
||||||
if (source == Z_NULL || dest == Z_NULL || source->state == Z_NULL) {
|
if (source == Z_NULL || dest == Z_NULL || source->state == Z_NULL) {
|
||||||
return Z_STREAM_ERROR;
|
return Z_STREAM_ERROR;
|
||||||
}
|
}
|
||||||
*dest = *source;
|
|
||||||
return Z_STREAM_ERROR; /* to be implemented */
|
|
||||||
#if 0
|
|
||||||
dest->state = (struct internal_state FAR *)
|
|
||||||
(*dest->zalloc)(1, sizeof(deflate_state));
|
|
||||||
if (dest->state == Z_NULL) return Z_MEM_ERROR;
|
|
||||||
|
|
||||||
*(dest->state) = *(source->state);
|
ss = source->state;
|
||||||
|
|
||||||
|
*dest = *source;
|
||||||
|
|
||||||
|
ds = (deflate_state *) ZALLOC(dest, 1, sizeof(deflate_state));
|
||||||
|
if (ds == Z_NULL) return Z_MEM_ERROR;
|
||||||
|
dest->state = (struct internal_state FAR *) ds;
|
||||||
|
*ds = *ss;
|
||||||
|
ds->strm = dest;
|
||||||
|
|
||||||
|
ds->window = (Bytef *) ZALLOC(dest, ds->w_size, 2*sizeof(Byte));
|
||||||
|
ds->prev = (Posf *) ZALLOC(dest, ds->w_size, sizeof(Pos));
|
||||||
|
ds->head = (Posf *) ZALLOC(dest, ds->hash_size, sizeof(Pos));
|
||||||
|
overlay = (ushf *) ZALLOC(dest, ds->lit_bufsize, sizeof(ush)+2);
|
||||||
|
ds->pending_buf = (uchf *) overlay;
|
||||||
|
|
||||||
|
if (ds->window == Z_NULL || ds->prev == Z_NULL || ds->head == Z_NULL ||
|
||||||
|
ds->pending_buf == Z_NULL) {
|
||||||
|
deflateEnd (dest);
|
||||||
|
return Z_MEM_ERROR;
|
||||||
|
}
|
||||||
|
/* following zmemcpy do not work for 16-bit MSDOS */
|
||||||
|
zmemcpy(ds->window, ss->window, ds->w_size * 2 * sizeof(Byte));
|
||||||
|
zmemcpy(ds->prev, ss->prev, ds->w_size * sizeof(Pos));
|
||||||
|
zmemcpy(ds->head, ss->head, ds->hash_size * sizeof(Pos));
|
||||||
|
zmemcpy(ds->pending_buf, ss->pending_buf, (uInt)ds->pending_buf_size);
|
||||||
|
|
||||||
|
ds->pending_out = ds->pending_buf + (ss->pending_out - ss->pending_buf);
|
||||||
|
ds->d_buf = overlay + ds->lit_bufsize/sizeof(ush);
|
||||||
|
ds->l_buf = ds->pending_buf + (1+sizeof(ush))*ds->lit_bufsize;
|
||||||
|
|
||||||
|
ds->l_desc.dyn_tree = ds->dyn_ltree;
|
||||||
|
ds->d_desc.dyn_tree = ds->dyn_dtree;
|
||||||
|
ds->bl_desc.dyn_tree = ds->bl_tree;
|
||||||
|
|
||||||
return Z_OK;
|
return Z_OK;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
@ -597,7 +661,7 @@ PR_PUBLIC_API(int) deflateCopy (dest, source)
|
|||||||
*/
|
*/
|
||||||
local int read_buf(strm, buf, size)
|
local int read_buf(strm, buf, size)
|
||||||
z_streamp strm;
|
z_streamp strm;
|
||||||
charf *buf;
|
Bytef *buf;
|
||||||
unsigned size;
|
unsigned size;
|
||||||
{
|
{
|
||||||
unsigned len = strm->avail_in;
|
unsigned len = strm->avail_in;
|
||||||
@ -658,6 +722,7 @@ local void lm_init (s)
|
|||||||
/* For 80x86 and 680x0, an optimized version will be provided in match.asm or
|
/* For 80x86 and 680x0, an optimized version will be provided in match.asm or
|
||||||
* match.S. The code will be functionally equivalent.
|
* match.S. The code will be functionally equivalent.
|
||||||
*/
|
*/
|
||||||
|
#ifndef FASTEST
|
||||||
local uInt longest_match(s, cur_match)
|
local uInt longest_match(s, cur_match)
|
||||||
deflate_state *s;
|
deflate_state *s;
|
||||||
IPos cur_match; /* current match */
|
IPos cur_match; /* current match */
|
||||||
@ -792,12 +857,70 @@ local uInt longest_match(s, cur_match)
|
|||||||
} while ((cur_match = prev[cur_match & wmask]) > limit
|
} while ((cur_match = prev[cur_match & wmask]) > limit
|
||||||
&& --chain_length != 0);
|
&& --chain_length != 0);
|
||||||
|
|
||||||
if ((uInt)best_len <= s->lookahead) return best_len;
|
if ((uInt)best_len <= s->lookahead) return (uInt)best_len;
|
||||||
return s->lookahead;
|
return s->lookahead;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#else /* FASTEST */
|
||||||
|
/* ---------------------------------------------------------------------------
|
||||||
|
* Optimized version for level == 1 only
|
||||||
|
*/
|
||||||
|
local uInt longest_match(s, cur_match)
|
||||||
|
deflate_state *s;
|
||||||
|
IPos cur_match; /* current match */
|
||||||
|
{
|
||||||
|
register Bytef *scan = s->window + s->strstart; /* current string */
|
||||||
|
register Bytef *match; /* matched string */
|
||||||
|
register int len; /* length of current match */
|
||||||
|
register Bytef *strend = s->window + s->strstart + MAX_MATCH;
|
||||||
|
|
||||||
|
/* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16.
|
||||||
|
* It is easy to get rid of this optimization if necessary.
|
||||||
|
*/
|
||||||
|
Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever");
|
||||||
|
|
||||||
|
Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead");
|
||||||
|
|
||||||
|
Assert(cur_match < s->strstart, "no future");
|
||||||
|
|
||||||
|
match = s->window + cur_match;
|
||||||
|
|
||||||
|
/* Return failure if the match length is less than 2:
|
||||||
|
*/
|
||||||
|
if (match[0] != scan[0] || match[1] != scan[1]) return MIN_MATCH-1;
|
||||||
|
|
||||||
|
/* The check at best_len-1 can be removed because it will be made
|
||||||
|
* again later. (This heuristic is not always a win.)
|
||||||
|
* It is not necessary to compare scan[2] and match[2] since they
|
||||||
|
* are always equal when the other bytes match, given that
|
||||||
|
* the hash keys are equal and that HASH_BITS >= 8.
|
||||||
|
*/
|
||||||
|
scan += 2, match += 2;
|
||||||
|
Assert(*scan == *match, "match[2]?");
|
||||||
|
|
||||||
|
/* We check for insufficient lookahead only every 8th comparison;
|
||||||
|
* the 256th check will be made at strstart+258.
|
||||||
|
*/
|
||||||
|
do {
|
||||||
|
} while (*++scan == *++match && *++scan == *++match &&
|
||||||
|
*++scan == *++match && *++scan == *++match &&
|
||||||
|
*++scan == *++match && *++scan == *++match &&
|
||||||
|
*++scan == *++match && *++scan == *++match &&
|
||||||
|
scan < strend);
|
||||||
|
|
||||||
|
Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan");
|
||||||
|
|
||||||
|
len = MAX_MATCH - (int)(strend - scan);
|
||||||
|
|
||||||
|
if (len < MIN_MATCH) return MIN_MATCH - 1;
|
||||||
|
|
||||||
|
s->match_start = cur_match;
|
||||||
|
return len <= s->lookahead ? len : s->lookahead;
|
||||||
|
}
|
||||||
|
#endif /* FASTEST */
|
||||||
#endif /* ASMV */
|
#endif /* ASMV */
|
||||||
|
|
||||||
#ifdef DEBUG_NEVER
|
#ifdef DEBUG
|
||||||
/* ===========================================================================
|
/* ===========================================================================
|
||||||
* Check that the match at match_start is indeed a match.
|
* Check that the match at match_start is indeed a match.
|
||||||
*/
|
*/
|
||||||
@ -807,18 +930,16 @@ local void check_match(s, start, match, length)
|
|||||||
int length;
|
int length;
|
||||||
{
|
{
|
||||||
/* check that the match is indeed a match */
|
/* check that the match is indeed a match */
|
||||||
if (zmemcmp((charf *)s->window + match,
|
if (zmemcmp(s->window + match,
|
||||||
(charf *)s->window + start, length) != EQUAL) {
|
s->window + start, length) != EQUAL) {
|
||||||
#if 0
|
|
||||||
fprintf(stderr, " start %u, match %u, length %d\n",
|
fprintf(stderr, " start %u, match %u, length %d\n",
|
||||||
start, match, length);
|
start, match, length);
|
||||||
#endif
|
|
||||||
do {
|
do {
|
||||||
fprintf(stderr, "%c%c", s->window[match++], s->window[start++]);
|
fprintf(stderr, "%c%c", s->window[match++], s->window[start++]);
|
||||||
} while (--length != 0);
|
} while (--length != 0);
|
||||||
z_error("invalid match");
|
z_error("invalid match");
|
||||||
}
|
}
|
||||||
if (verbose > 1) {
|
if (z_verbose > 1) {
|
||||||
fprintf(stderr,"\\[%d,%d]", start-match, length);
|
fprintf(stderr,"\\[%d,%d]", start-match, length);
|
||||||
do { putc(s->window[start++], stderr); } while (--length != 0);
|
do { putc(s->window[start++], stderr); } while (--length != 0);
|
||||||
}
|
}
|
||||||
@ -863,33 +984,35 @@ local void fill_window(s)
|
|||||||
*/
|
*/
|
||||||
} else if (s->strstart >= wsize+MAX_DIST(s)) {
|
} else if (s->strstart >= wsize+MAX_DIST(s)) {
|
||||||
|
|
||||||
zmemcpy((charf *)s->window, (charf *)s->window+wsize,
|
zmemcpy(s->window, s->window+wsize, (unsigned)wsize);
|
||||||
(unsigned)wsize);
|
|
||||||
s->match_start -= wsize;
|
s->match_start -= wsize;
|
||||||
s->strstart -= wsize; /* we now have strstart >= MAX_DIST */
|
s->strstart -= wsize; /* we now have strstart >= MAX_DIST */
|
||||||
|
|
||||||
s->block_start -= (long) wsize;
|
s->block_start -= (long) wsize;
|
||||||
|
|
||||||
/* Slide the hash table (could be avoided with 32 bit values
|
/* Slide the hash table (could be avoided with 32 bit values
|
||||||
at the expense of memory usage):
|
at the expense of memory usage). We slide even when level == 0
|
||||||
|
to keep the hash table consistent if we switch back to level > 0
|
||||||
|
later. (Using level 0 permanently is not an optimal usage of
|
||||||
|
zlib, so we don't care about this pathological case.)
|
||||||
*/
|
*/
|
||||||
n = s->hash_size;
|
n = s->hash_size;
|
||||||
p = &s->head[n];
|
p = &s->head[n];
|
||||||
do {
|
do {
|
||||||
m = *--p;
|
m = *--p;
|
||||||
*p = (Pos)(m >= wsize ? m-wsize : NIL);
|
*p = (Pos)(m >= wsize ? m-wsize : NIL);
|
||||||
} while (--n);
|
} while (--n);
|
||||||
|
|
||||||
n = wsize;
|
|
||||||
p = &s->prev[n];
|
|
||||||
do {
|
|
||||||
m = *--p;
|
|
||||||
*p = (Pos)(m >= wsize ? m-wsize : NIL);
|
|
||||||
/* If n is not on any hash chain, prev[n] is garbage but
|
|
||||||
* its value will never be used.
|
|
||||||
*/
|
|
||||||
} while (--n);
|
|
||||||
|
|
||||||
|
n = wsize;
|
||||||
|
#ifndef FASTEST
|
||||||
|
p = &s->prev[n];
|
||||||
|
do {
|
||||||
|
m = *--p;
|
||||||
|
*p = (Pos)(m >= wsize ? m-wsize : NIL);
|
||||||
|
/* If n is not on any hash chain, prev[n] is garbage but
|
||||||
|
* its value will never be used.
|
||||||
|
*/
|
||||||
|
} while (--n);
|
||||||
|
#endif
|
||||||
more += wsize;
|
more += wsize;
|
||||||
}
|
}
|
||||||
if (s->strm->avail_in == 0) return;
|
if (s->strm->avail_in == 0) return;
|
||||||
@ -907,8 +1030,7 @@ local void fill_window(s)
|
|||||||
*/
|
*/
|
||||||
Assert(more >= 2, "more < 2");
|
Assert(more >= 2, "more < 2");
|
||||||
|
|
||||||
n = read_buf(s->strm, (charf *)s->window + s->strstart + s->lookahead,
|
n = read_buf(s->strm, s->window + s->strstart + s->lookahead, more);
|
||||||
more);
|
|
||||||
s->lookahead += n;
|
s->lookahead += n;
|
||||||
|
|
||||||
/* Initialize the hash value now that we have some input: */
|
/* Initialize the hash value now that we have some input: */
|
||||||
@ -953,12 +1075,24 @@ local void fill_window(s)
|
|||||||
* This function does not insert new strings in the dictionary since
|
* This function does not insert new strings in the dictionary since
|
||||||
* uncompressible data is probably not useful. This function is used
|
* uncompressible data is probably not useful. This function is used
|
||||||
* only for the level=0 compression option.
|
* only for the level=0 compression option.
|
||||||
* NOTE: this function should be optimized to avoid extra copying.
|
* NOTE: this function should be optimized to avoid extra copying from
|
||||||
|
* window to pending_buf.
|
||||||
*/
|
*/
|
||||||
local block_state deflate_stored(s, flush)
|
local block_state deflate_stored(s, flush)
|
||||||
deflate_state *s;
|
deflate_state *s;
|
||||||
int flush;
|
int flush;
|
||||||
{
|
{
|
||||||
|
/* Stored blocks are limited to 0xffff bytes, pending_buf is limited
|
||||||
|
* to pending_buf_size, and each stored block has a 5 byte header:
|
||||||
|
*/
|
||||||
|
ulg max_block_size = 0xffff;
|
||||||
|
ulg max_start;
|
||||||
|
|
||||||
|
if (max_block_size > s->pending_buf_size - 5) {
|
||||||
|
max_block_size = s->pending_buf_size - 5;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Copy as much as possible from input to output: */
|
||||||
for (;;) {
|
for (;;) {
|
||||||
/* Fill the window as much as possible: */
|
/* Fill the window as much as possible: */
|
||||||
if (s->lookahead <= 1) {
|
if (s->lookahead <= 1) {
|
||||||
@ -976,14 +1110,17 @@ local block_state deflate_stored(s, flush)
|
|||||||
s->strstart += s->lookahead;
|
s->strstart += s->lookahead;
|
||||||
s->lookahead = 0;
|
s->lookahead = 0;
|
||||||
|
|
||||||
/* Stored blocks are limited to 0xffff bytes: */
|
/* Emit a stored block if pending_buf will be full: */
|
||||||
if (s->strstart == 0 || s->strstart > 0xfffe) {
|
max_start = s->block_start + max_block_size;
|
||||||
|
if (s->strstart == 0 || (ulg)s->strstart >= max_start) {
|
||||||
/* strstart == 0 is possible when wraparound on 16-bit machine */
|
/* strstart == 0 is possible when wraparound on 16-bit machine */
|
||||||
s->lookahead = s->strstart - 0xffff;
|
s->lookahead = (uInt)(s->strstart - max_start);
|
||||||
s->strstart = 0xffff;
|
s->strstart = (uInt)max_start;
|
||||||
|
FLUSH_BLOCK(s, 0);
|
||||||
}
|
}
|
||||||
|
/* Flush if we may have to slide, otherwise block_start may become
|
||||||
/* Emit a stored block if it is large enough: */
|
* negative and the data will be gone:
|
||||||
|
*/
|
||||||
if (s->strstart - (uInt)s->block_start >= MAX_DIST(s)) {
|
if (s->strstart - (uInt)s->block_start >= MAX_DIST(s)) {
|
||||||
FLUSH_BLOCK(s, 0);
|
FLUSH_BLOCK(s, 0);
|
||||||
}
|
}
|
||||||
@ -1043,14 +1180,15 @@ local block_state deflate_fast(s, flush)
|
|||||||
if (s->match_length >= MIN_MATCH) {
|
if (s->match_length >= MIN_MATCH) {
|
||||||
check_match(s, s->strstart, s->match_start, s->match_length);
|
check_match(s, s->strstart, s->match_start, s->match_length);
|
||||||
|
|
||||||
bflush = _tr_tally(s, s->strstart - s->match_start,
|
_tr_tally_dist(s, s->strstart - s->match_start,
|
||||||
s->match_length - MIN_MATCH);
|
s->match_length - MIN_MATCH, bflush);
|
||||||
|
|
||||||
s->lookahead -= s->match_length;
|
s->lookahead -= s->match_length;
|
||||||
|
|
||||||
/* Insert new strings in the hash table only if the match length
|
/* Insert new strings in the hash table only if the match length
|
||||||
* is not too large. This saves time but degrades compression.
|
* is not too large. This saves time but degrades compression.
|
||||||
*/
|
*/
|
||||||
|
#ifndef FASTEST
|
||||||
if (s->match_length <= s->max_insert_length &&
|
if (s->match_length <= s->max_insert_length &&
|
||||||
s->lookahead >= MIN_MATCH) {
|
s->lookahead >= MIN_MATCH) {
|
||||||
s->match_length--; /* string at strstart already in hash table */
|
s->match_length--; /* string at strstart already in hash table */
|
||||||
@ -1062,7 +1200,9 @@ local block_state deflate_fast(s, flush)
|
|||||||
*/
|
*/
|
||||||
} while (--s->match_length != 0);
|
} while (--s->match_length != 0);
|
||||||
s->strstart++;
|
s->strstart++;
|
||||||
} else {
|
} else
|
||||||
|
#endif
|
||||||
|
{
|
||||||
s->strstart += s->match_length;
|
s->strstart += s->match_length;
|
||||||
s->match_length = 0;
|
s->match_length = 0;
|
||||||
s->ins_h = s->window[s->strstart];
|
s->ins_h = s->window[s->strstart];
|
||||||
@ -1077,7 +1217,7 @@ local block_state deflate_fast(s, flush)
|
|||||||
} else {
|
} else {
|
||||||
/* No match, output a literal byte */
|
/* No match, output a literal byte */
|
||||||
Tracevv((stderr,"%c", s->window[s->strstart]));
|
Tracevv((stderr,"%c", s->window[s->strstart]));
|
||||||
bflush = _tr_tally (s, 0, s->window[s->strstart]);
|
_tr_tally_lit (s, s->window[s->strstart], bflush);
|
||||||
s->lookahead--;
|
s->lookahead--;
|
||||||
s->strstart++;
|
s->strstart++;
|
||||||
}
|
}
|
||||||
@ -1156,8 +1296,8 @@ local block_state deflate_slow(s, flush)
|
|||||||
|
|
||||||
check_match(s, s->strstart-1, s->prev_match, s->prev_length);
|
check_match(s, s->strstart-1, s->prev_match, s->prev_length);
|
||||||
|
|
||||||
bflush = _tr_tally(s, s->strstart -1 - s->prev_match,
|
_tr_tally_dist(s, s->strstart -1 - s->prev_match,
|
||||||
s->prev_length - MIN_MATCH);
|
s->prev_length - MIN_MATCH, bflush);
|
||||||
|
|
||||||
/* Insert in hash table all strings up to the end of the match.
|
/* Insert in hash table all strings up to the end of the match.
|
||||||
* strstart-1 and strstart are already inserted. If there is not
|
* strstart-1 and strstart are already inserted. If there is not
|
||||||
@ -1183,7 +1323,8 @@ local block_state deflate_slow(s, flush)
|
|||||||
* is longer, truncate the previous match to a single literal.
|
* is longer, truncate the previous match to a single literal.
|
||||||
*/
|
*/
|
||||||
Tracevv((stderr,"%c", s->window[s->strstart-1]));
|
Tracevv((stderr,"%c", s->window[s->strstart-1]));
|
||||||
if (_tr_tally (s, 0, s->window[s->strstart-1])) {
|
_tr_tally_lit(s, s->window[s->strstart-1], bflush);
|
||||||
|
if (bflush) {
|
||||||
FLUSH_BLOCK_ONLY(s, 0);
|
FLUSH_BLOCK_ONLY(s, 0);
|
||||||
}
|
}
|
||||||
s->strstart++;
|
s->strstart++;
|
||||||
@ -1201,7 +1342,7 @@ local block_state deflate_slow(s, flush)
|
|||||||
Assert (flush != Z_NO_FLUSH, "no flush?");
|
Assert (flush != Z_NO_FLUSH, "no flush?");
|
||||||
if (s->match_available) {
|
if (s->match_available) {
|
||||||
Tracevv((stderr,"%c", s->window[s->strstart-1]));
|
Tracevv((stderr,"%c", s->window[s->strstart-1]));
|
||||||
_tr_tally (s, 0, s->window[s->strstart-1]);
|
_tr_tally_lit(s, s->window[s->strstart-1], bflush);
|
||||||
s->match_available = 0;
|
s->match_available = 0;
|
||||||
}
|
}
|
||||||
FLUSH_BLOCK(s, flush == Z_FINISH);
|
FLUSH_BLOCK(s, flush == Z_FINISH);
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* deflate.h -- internal compression state
|
/* deflate.h -- internal compression state
|
||||||
* Copyright (C) 1995-1996 Jean-loup Gailly
|
* Copyright (C) 1995-1998 Jean-loup Gailly
|
||||||
* For conditions of distribution and use, see copyright notice in zlib.h
|
* For conditions of distribution and use, see copyright notice in zlib.h
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@ -8,7 +8,7 @@
|
|||||||
subject to change. Applications should only use zlib.h.
|
subject to change. Applications should only use zlib.h.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* $Id: deflate.h,v 3.1 1998/03/28 03:36:11 ltabb Exp $ */
|
/* @(#) $Id: deflate.h,v 3.2 2001/06/30 23:37:52 leaf%mozilla.org Exp $ */
|
||||||
|
|
||||||
#ifndef _DEFLATE_H
|
#ifndef _DEFLATE_H
|
||||||
#define _DEFLATE_H
|
#define _DEFLATE_H
|
||||||
@ -83,6 +83,7 @@ typedef struct internal_state {
|
|||||||
z_streamp strm; /* pointer back to this zlib stream */
|
z_streamp strm; /* pointer back to this zlib stream */
|
||||||
int status; /* as the name implies */
|
int status; /* as the name implies */
|
||||||
Bytef *pending_buf; /* output still pending */
|
Bytef *pending_buf; /* output still pending */
|
||||||
|
ulg pending_buf_size; /* size of pending_buf */
|
||||||
Bytef *pending_out; /* next pending byte to output to the stream */
|
Bytef *pending_out; /* next pending byte to output to the stream */
|
||||||
int pending; /* nb of bytes in the pending buffer */
|
int pending; /* nb of bytes in the pending buffer */
|
||||||
int noheader; /* suppress zlib header and adler32 */
|
int noheader; /* suppress zlib header and adler32 */
|
||||||
@ -229,12 +230,12 @@ typedef struct internal_state {
|
|||||||
|
|
||||||
ulg opt_len; /* bit length of current block with optimal trees */
|
ulg opt_len; /* bit length of current block with optimal trees */
|
||||||
ulg static_len; /* bit length of current block with static trees */
|
ulg static_len; /* bit length of current block with static trees */
|
||||||
ulg compressed_len; /* total bit length of compressed file */
|
|
||||||
uInt matches; /* number of string matches in current block */
|
uInt matches; /* number of string matches in current block */
|
||||||
int last_eob_len; /* bit length of EOB code for last block */
|
int last_eob_len; /* bit length of EOB code for last block */
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
ulg bits_sent; /* bit length of the compressed data */
|
ulg compressed_len; /* total bit length of compressed file mod 2^32 */
|
||||||
|
ulg bits_sent; /* bit length of compressed data sent mod 2^32 */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
ush bi_buf;
|
ush bi_buf;
|
||||||
@ -267,9 +268,51 @@ typedef struct internal_state {
|
|||||||
/* in trees.c */
|
/* in trees.c */
|
||||||
void _tr_init OF((deflate_state *s));
|
void _tr_init OF((deflate_state *s));
|
||||||
int _tr_tally OF((deflate_state *s, unsigned dist, unsigned lc));
|
int _tr_tally OF((deflate_state *s, unsigned dist, unsigned lc));
|
||||||
ulg _tr_flush_block OF((deflate_state *s, charf *buf, ulg stored_len,
|
void _tr_flush_block OF((deflate_state *s, charf *buf, ulg stored_len,
|
||||||
int eof));
|
int eof));
|
||||||
void _tr_align OF((deflate_state *s));
|
void _tr_align OF((deflate_state *s));
|
||||||
void _tr_stored_block OF((deflate_state *s, charf *buf, ulg stored_len,
|
void _tr_stored_block OF((deflate_state *s, charf *buf, ulg stored_len,
|
||||||
int eof));
|
int eof));
|
||||||
|
|
||||||
|
#define d_code(dist) \
|
||||||
|
((dist) < 256 ? _dist_code[dist] : _dist_code[256+((dist)>>7)])
|
||||||
|
/* Mapping from a distance to a distance code. dist is the distance - 1 and
|
||||||
|
* must not have side effects. _dist_code[256] and _dist_code[257] are never
|
||||||
|
* used.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef DEBUG
|
||||||
|
/* Inline versions of _tr_tally for speed: */
|
||||||
|
|
||||||
|
#if defined(GEN_TREES_H) || !defined(STDC)
|
||||||
|
extern uch _length_code[];
|
||||||
|
extern uch _dist_code[];
|
||||||
|
#else
|
||||||
|
extern const uch _length_code[];
|
||||||
|
extern const uch _dist_code[];
|
||||||
|
#endif
|
||||||
|
|
||||||
|
# define _tr_tally_lit(s, c, flush) \
|
||||||
|
{ uch cc = (c); \
|
||||||
|
s->d_buf[s->last_lit] = 0; \
|
||||||
|
s->l_buf[s->last_lit++] = cc; \
|
||||||
|
s->dyn_ltree[cc].Freq++; \
|
||||||
|
flush = (s->last_lit == s->lit_bufsize-1); \
|
||||||
|
}
|
||||||
|
# define _tr_tally_dist(s, distance, length, flush) \
|
||||||
|
{ uch len = (length); \
|
||||||
|
ush dist = (distance); \
|
||||||
|
s->d_buf[s->last_lit] = dist; \
|
||||||
|
s->l_buf[s->last_lit++] = len; \
|
||||||
|
dist--; \
|
||||||
|
s->dyn_ltree[_length_code[len]+LITERALS+1].Freq++; \
|
||||||
|
s->dyn_dtree[d_code(dist)].Freq++; \
|
||||||
|
flush = (s->last_lit == s->lit_bufsize-1); \
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
# define _tr_tally_lit(s, c, flush) flush = _tr_tally(s, 0, c)
|
||||||
|
# define _tr_tally_dist(s, distance, length, flush) \
|
||||||
|
flush = _tr_tally(s, distance, length)
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -1,9 +1,9 @@
|
|||||||
/* example.c -- usage example of the zlib compression library
|
/* example.c -- usage example of the zlib compression library
|
||||||
* Copyright (C) 1995-1996 Jean-loup Gailly.
|
* Copyright (C) 1995-1998 Jean-loup Gailly.
|
||||||
* For conditions of distribution and use, see copyright notice in zlib.h
|
* For conditions of distribution and use, see copyright notice in zlib.h
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* $Id: example.c,v 3.1 1998/03/28 03:36:11 ltabb Exp $ */
|
/* @(#) $Id: example.c,v 3.2 2001/06/30 23:37:52 leaf%mozilla.org Exp $ */
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include "zlib.h"
|
#include "zlib.h"
|
||||||
@ -15,6 +15,12 @@
|
|||||||
extern void exit OF((int));
|
extern void exit OF((int));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(VMS) || defined(RISCOS)
|
||||||
|
# define TESTFILE "foo-gz"
|
||||||
|
#else
|
||||||
|
# define TESTFILE "foo.gz"
|
||||||
|
#endif
|
||||||
|
|
||||||
#define CHECK_ERR(err, msg) { \
|
#define CHECK_ERR(err, msg) { \
|
||||||
if (err != Z_OK) { \
|
if (err != Z_OK) { \
|
||||||
fprintf(stderr, "%s error: %d\n", msg, err); \
|
fprintf(stderr, "%s error: %d\n", msg, err); \
|
||||||
@ -41,7 +47,7 @@ void test_large_deflate OF((Byte *compr, uLong comprLen,
|
|||||||
Byte *uncompr, uLong uncomprLen));
|
Byte *uncompr, uLong uncomprLen));
|
||||||
void test_large_inflate OF((Byte *compr, uLong comprLen,
|
void test_large_inflate OF((Byte *compr, uLong comprLen,
|
||||||
Byte *uncompr, uLong uncomprLen));
|
Byte *uncompr, uLong uncomprLen));
|
||||||
void test_flush OF((Byte *compr, uLong comprLen));
|
void test_flush OF((Byte *compr, uLong *comprLen));
|
||||||
void test_sync OF((Byte *compr, uLong comprLen,
|
void test_sync OF((Byte *compr, uLong comprLen,
|
||||||
Byte *uncompr, uLong uncomprLen));
|
Byte *uncompr, uLong uncomprLen));
|
||||||
void test_dict_deflate OF((Byte *compr, uLong comprLen));
|
void test_dict_deflate OF((Byte *compr, uLong comprLen));
|
||||||
@ -69,8 +75,9 @@ void test_compress(compr, comprLen, uncompr, uncomprLen)
|
|||||||
|
|
||||||
if (strcmp((char*)uncompr, hello)) {
|
if (strcmp((char*)uncompr, hello)) {
|
||||||
fprintf(stderr, "bad uncompress\n");
|
fprintf(stderr, "bad uncompress\n");
|
||||||
|
exit(1);
|
||||||
} else {
|
} else {
|
||||||
printf("uncompress(): %s\n", uncompr);
|
printf("uncompress(): %s\n", (char *)uncompr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -78,24 +85,31 @@ void test_compress(compr, comprLen, uncompr, uncomprLen)
|
|||||||
* Test read/write of .gz files
|
* Test read/write of .gz files
|
||||||
*/
|
*/
|
||||||
void test_gzio(out, in, uncompr, uncomprLen)
|
void test_gzio(out, in, uncompr, uncomprLen)
|
||||||
const char *out; /* output file */
|
const char *out; /* compressed output file */
|
||||||
const char *in; /* input file */
|
const char *in; /* compressed input file */
|
||||||
Byte *uncompr;
|
Byte *uncompr;
|
||||||
int uncomprLen;
|
int uncomprLen;
|
||||||
{
|
{
|
||||||
int err;
|
int err;
|
||||||
int len = strlen(hello)+1;
|
int len = strlen(hello)+1;
|
||||||
gzFile file;
|
gzFile file;
|
||||||
|
z_off_t pos;
|
||||||
|
|
||||||
file = gzopen(out, "wb");
|
file = gzopen(out, "wb");
|
||||||
if (file == NULL) {
|
if (file == NULL) {
|
||||||
fprintf(stderr, "gzopen error\n");
|
fprintf(stderr, "gzopen error\n");
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
gzputc(file, 'h');
|
||||||
if (gzwrite(file, (const voidp)hello, (unsigned)len) != len) {
|
if (gzputs(file, "ello") != 4) {
|
||||||
fprintf(stderr, "gzwrite err: %s\n", gzerror(file, &err));
|
fprintf(stderr, "gzputs err: %s\n", gzerror(file, &err));
|
||||||
|
exit(1);
|
||||||
}
|
}
|
||||||
|
if (gzprintf(file, ", %s!", "hello") != 8) {
|
||||||
|
fprintf(stderr, "gzprintf err: %s\n", gzerror(file, &err));
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
gzseek(file, 1L, SEEK_CUR); /* add one zero byte */
|
||||||
gzclose(file);
|
gzclose(file);
|
||||||
|
|
||||||
file = gzopen(in, "rb");
|
file = gzopen(in, "rb");
|
||||||
@ -107,14 +121,41 @@ void test_gzio(out, in, uncompr, uncomprLen)
|
|||||||
uncomprLen = gzread(file, uncompr, (unsigned)uncomprLen);
|
uncomprLen = gzread(file, uncompr, (unsigned)uncomprLen);
|
||||||
if (uncomprLen != len) {
|
if (uncomprLen != len) {
|
||||||
fprintf(stderr, "gzread err: %s\n", gzerror(file, &err));
|
fprintf(stderr, "gzread err: %s\n", gzerror(file, &err));
|
||||||
|
exit(1);
|
||||||
}
|
}
|
||||||
gzclose(file);
|
|
||||||
|
|
||||||
if (strcmp((char*)uncompr, hello)) {
|
if (strcmp((char*)uncompr, hello)) {
|
||||||
fprintf(stderr, "bad gzread\n");
|
fprintf(stderr, "bad gzread: %s\n", (char*)uncompr);
|
||||||
|
exit(1);
|
||||||
} else {
|
} else {
|
||||||
printf("gzread(): %s\n", uncompr);
|
printf("gzread(): %s\n", (char *)uncompr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pos = gzseek(file, -8L, SEEK_CUR);
|
||||||
|
if (pos != 6 || gztell(file) != pos) {
|
||||||
|
fprintf(stderr, "gzseek error, pos=%ld, gztell=%ld\n",
|
||||||
|
(long)pos, (long)gztell(file));
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (gzgetc(file) != ' ') {
|
||||||
|
fprintf(stderr, "gzgetc error\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
gzgets(file, (char*)uncompr, uncomprLen);
|
||||||
|
uncomprLen = strlen((char*)uncompr);
|
||||||
|
if (uncomprLen != 6) { /* "hello!" */
|
||||||
|
fprintf(stderr, "gzgets err after gzseek: %s\n", gzerror(file, &err));
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
if (strcmp((char*)uncompr, hello+7)) {
|
||||||
|
fprintf(stderr, "bad gzgets after gzseek\n");
|
||||||
|
exit(1);
|
||||||
|
} else {
|
||||||
|
printf("gzgets() after gzseek: %s\n", (char *)uncompr);
|
||||||
|
}
|
||||||
|
|
||||||
|
gzclose(file);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ===========================================================================
|
/* ===========================================================================
|
||||||
@ -171,12 +212,13 @@ void test_inflate(compr, comprLen, uncompr, uncomprLen)
|
|||||||
d_stream.zfree = (free_func)0;
|
d_stream.zfree = (free_func)0;
|
||||||
d_stream.opaque = (voidpf)0;
|
d_stream.opaque = (voidpf)0;
|
||||||
|
|
||||||
|
d_stream.next_in = compr;
|
||||||
|
d_stream.avail_in = 0;
|
||||||
|
d_stream.next_out = uncompr;
|
||||||
|
|
||||||
err = inflateInit(&d_stream);
|
err = inflateInit(&d_stream);
|
||||||
CHECK_ERR(err, "inflateInit");
|
CHECK_ERR(err, "inflateInit");
|
||||||
|
|
||||||
d_stream.next_in = compr;
|
|
||||||
d_stream.next_out = uncompr;
|
|
||||||
|
|
||||||
while (d_stream.total_out < uncomprLen && d_stream.total_in < comprLen) {
|
while (d_stream.total_out < uncomprLen && d_stream.total_in < comprLen) {
|
||||||
d_stream.avail_in = d_stream.avail_out = 1; /* force small buffers */
|
d_stream.avail_in = d_stream.avail_out = 1; /* force small buffers */
|
||||||
err = inflate(&d_stream, Z_NO_FLUSH);
|
err = inflate(&d_stream, Z_NO_FLUSH);
|
||||||
@ -189,8 +231,9 @@ void test_inflate(compr, comprLen, uncompr, uncomprLen)
|
|||||||
|
|
||||||
if (strcmp((char*)uncompr, hello)) {
|
if (strcmp((char*)uncompr, hello)) {
|
||||||
fprintf(stderr, "bad inflate\n");
|
fprintf(stderr, "bad inflate\n");
|
||||||
|
exit(1);
|
||||||
} else {
|
} else {
|
||||||
printf("inflate(): %s\n", uncompr);
|
printf("inflate(): %s\n", (char *)uncompr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -223,6 +266,7 @@ void test_large_deflate(compr, comprLen, uncompr, uncomprLen)
|
|||||||
CHECK_ERR(err, "deflate");
|
CHECK_ERR(err, "deflate");
|
||||||
if (c_stream.avail_in != 0) {
|
if (c_stream.avail_in != 0) {
|
||||||
fprintf(stderr, "deflate not greedy\n");
|
fprintf(stderr, "deflate not greedy\n");
|
||||||
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Feed in already compressed data and switch to no compression: */
|
/* Feed in already compressed data and switch to no compression: */
|
||||||
@ -242,6 +286,7 @@ void test_large_deflate(compr, comprLen, uncompr, uncomprLen)
|
|||||||
err = deflate(&c_stream, Z_FINISH);
|
err = deflate(&c_stream, Z_FINISH);
|
||||||
if (err != Z_STREAM_END) {
|
if (err != Z_STREAM_END) {
|
||||||
fprintf(stderr, "deflate should report Z_STREAM_END\n");
|
fprintf(stderr, "deflate should report Z_STREAM_END\n");
|
||||||
|
exit(1);
|
||||||
}
|
}
|
||||||
err = deflateEnd(&c_stream);
|
err = deflateEnd(&c_stream);
|
||||||
CHECK_ERR(err, "deflateEnd");
|
CHECK_ERR(err, "deflateEnd");
|
||||||
@ -263,12 +308,12 @@ void test_large_inflate(compr, comprLen, uncompr, uncomprLen)
|
|||||||
d_stream.zfree = (free_func)0;
|
d_stream.zfree = (free_func)0;
|
||||||
d_stream.opaque = (voidpf)0;
|
d_stream.opaque = (voidpf)0;
|
||||||
|
|
||||||
err = inflateInit(&d_stream);
|
|
||||||
CHECK_ERR(err, "inflateInit");
|
|
||||||
|
|
||||||
d_stream.next_in = compr;
|
d_stream.next_in = compr;
|
||||||
d_stream.avail_in = (uInt)comprLen;
|
d_stream.avail_in = (uInt)comprLen;
|
||||||
|
|
||||||
|
err = inflateInit(&d_stream);
|
||||||
|
CHECK_ERR(err, "inflateInit");
|
||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
d_stream.next_out = uncompr; /* discard the output */
|
d_stream.next_out = uncompr; /* discard the output */
|
||||||
d_stream.avail_out = (uInt)uncomprLen;
|
d_stream.avail_out = (uInt)uncomprLen;
|
||||||
@ -282,6 +327,7 @@ void test_large_inflate(compr, comprLen, uncompr, uncomprLen)
|
|||||||
|
|
||||||
if (d_stream.total_out != 2*uncomprLen + comprLen/2) {
|
if (d_stream.total_out != 2*uncomprLen + comprLen/2) {
|
||||||
fprintf(stderr, "bad large inflate: %ld\n", d_stream.total_out);
|
fprintf(stderr, "bad large inflate: %ld\n", d_stream.total_out);
|
||||||
|
exit(1);
|
||||||
} else {
|
} else {
|
||||||
printf("large_inflate(): OK\n");
|
printf("large_inflate(): OK\n");
|
||||||
}
|
}
|
||||||
@ -292,7 +338,7 @@ void test_large_inflate(compr, comprLen, uncompr, uncomprLen)
|
|||||||
*/
|
*/
|
||||||
void test_flush(compr, comprLen)
|
void test_flush(compr, comprLen)
|
||||||
Byte *compr;
|
Byte *compr;
|
||||||
uLong comprLen;
|
uLong *comprLen;
|
||||||
{
|
{
|
||||||
z_stream c_stream; /* compression stream */
|
z_stream c_stream; /* compression stream */
|
||||||
int err;
|
int err;
|
||||||
@ -308,7 +354,7 @@ void test_flush(compr, comprLen)
|
|||||||
c_stream.next_in = (Bytef*)hello;
|
c_stream.next_in = (Bytef*)hello;
|
||||||
c_stream.next_out = compr;
|
c_stream.next_out = compr;
|
||||||
c_stream.avail_in = 3;
|
c_stream.avail_in = 3;
|
||||||
c_stream.avail_out = (uInt)comprLen;
|
c_stream.avail_out = (uInt)*comprLen;
|
||||||
err = deflate(&c_stream, Z_FULL_FLUSH);
|
err = deflate(&c_stream, Z_FULL_FLUSH);
|
||||||
CHECK_ERR(err, "deflate");
|
CHECK_ERR(err, "deflate");
|
||||||
|
|
||||||
@ -321,6 +367,8 @@ void test_flush(compr, comprLen)
|
|||||||
}
|
}
|
||||||
err = deflateEnd(&c_stream);
|
err = deflateEnd(&c_stream);
|
||||||
CHECK_ERR(err, "deflateEnd");
|
CHECK_ERR(err, "deflateEnd");
|
||||||
|
|
||||||
|
*comprLen = c_stream.total_out;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ===========================================================================
|
/* ===========================================================================
|
||||||
@ -339,12 +387,13 @@ void test_sync(compr, comprLen, uncompr, uncomprLen)
|
|||||||
d_stream.zfree = (free_func)0;
|
d_stream.zfree = (free_func)0;
|
||||||
d_stream.opaque = (voidpf)0;
|
d_stream.opaque = (voidpf)0;
|
||||||
|
|
||||||
|
d_stream.next_in = compr;
|
||||||
|
d_stream.avail_in = 2; /* just read the zlib header */
|
||||||
|
|
||||||
err = inflateInit(&d_stream);
|
err = inflateInit(&d_stream);
|
||||||
CHECK_ERR(err, "inflateInit");
|
CHECK_ERR(err, "inflateInit");
|
||||||
|
|
||||||
d_stream.next_in = compr;
|
|
||||||
d_stream.next_out = uncompr;
|
d_stream.next_out = uncompr;
|
||||||
d_stream.avail_in = 2; /* just read the zlib header */
|
|
||||||
d_stream.avail_out = (uInt)uncomprLen;
|
d_stream.avail_out = (uInt)uncomprLen;
|
||||||
|
|
||||||
inflate(&d_stream, Z_NO_FLUSH);
|
inflate(&d_stream, Z_NO_FLUSH);
|
||||||
@ -358,11 +407,12 @@ void test_sync(compr, comprLen, uncompr, uncomprLen)
|
|||||||
if (err != Z_DATA_ERROR) {
|
if (err != Z_DATA_ERROR) {
|
||||||
fprintf(stderr, "inflate should report DATA_ERROR\n");
|
fprintf(stderr, "inflate should report DATA_ERROR\n");
|
||||||
/* Because of incorrect adler32 */
|
/* Because of incorrect adler32 */
|
||||||
|
exit(1);
|
||||||
}
|
}
|
||||||
err = inflateEnd(&d_stream);
|
err = inflateEnd(&d_stream);
|
||||||
CHECK_ERR(err, "inflateEnd");
|
CHECK_ERR(err, "inflateEnd");
|
||||||
|
|
||||||
printf("after inflateSync(): hel%s\n", uncompr);
|
printf("after inflateSync(): hel%s\n", (char *)uncompr);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ===========================================================================
|
/* ===========================================================================
|
||||||
@ -396,6 +446,7 @@ void test_dict_deflate(compr, comprLen)
|
|||||||
err = deflate(&c_stream, Z_FINISH);
|
err = deflate(&c_stream, Z_FINISH);
|
||||||
if (err != Z_STREAM_END) {
|
if (err != Z_STREAM_END) {
|
||||||
fprintf(stderr, "deflate should report Z_STREAM_END\n");
|
fprintf(stderr, "deflate should report Z_STREAM_END\n");
|
||||||
|
exit(1);
|
||||||
}
|
}
|
||||||
err = deflateEnd(&c_stream);
|
err = deflateEnd(&c_stream);
|
||||||
CHECK_ERR(err, "deflateEnd");
|
CHECK_ERR(err, "deflateEnd");
|
||||||
@ -417,12 +468,12 @@ void test_dict_inflate(compr, comprLen, uncompr, uncomprLen)
|
|||||||
d_stream.zfree = (free_func)0;
|
d_stream.zfree = (free_func)0;
|
||||||
d_stream.opaque = (voidpf)0;
|
d_stream.opaque = (voidpf)0;
|
||||||
|
|
||||||
err = inflateInit(&d_stream);
|
|
||||||
CHECK_ERR(err, "inflateInit");
|
|
||||||
|
|
||||||
d_stream.next_in = compr;
|
d_stream.next_in = compr;
|
||||||
d_stream.avail_in = (uInt)comprLen;
|
d_stream.avail_in = (uInt)comprLen;
|
||||||
|
|
||||||
|
err = inflateInit(&d_stream);
|
||||||
|
CHECK_ERR(err, "inflateInit");
|
||||||
|
|
||||||
d_stream.next_out = uncompr;
|
d_stream.next_out = uncompr;
|
||||||
d_stream.avail_out = (uInt)uncomprLen;
|
d_stream.avail_out = (uInt)uncomprLen;
|
||||||
|
|
||||||
@ -445,8 +496,9 @@ void test_dict_inflate(compr, comprLen, uncompr, uncomprLen)
|
|||||||
|
|
||||||
if (strcmp((char*)uncompr, hello)) {
|
if (strcmp((char*)uncompr, hello)) {
|
||||||
fprintf(stderr, "bad inflate with dict\n");
|
fprintf(stderr, "bad inflate with dict\n");
|
||||||
|
exit(1);
|
||||||
} else {
|
} else {
|
||||||
printf("inflate with dictionary: %s\n", uncompr);
|
printf("inflate with dictionary: %s\n", (char *)uncompr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -461,8 +513,9 @@ int main(argc, argv)
|
|||||||
Byte *compr, *uncompr;
|
Byte *compr, *uncompr;
|
||||||
uLong comprLen = 10000*sizeof(int); /* don't overflow on MSDOS */
|
uLong comprLen = 10000*sizeof(int); /* don't overflow on MSDOS */
|
||||||
uLong uncomprLen = comprLen;
|
uLong uncomprLen = comprLen;
|
||||||
|
static const char* myVersion = ZLIB_VERSION;
|
||||||
|
|
||||||
if (zlibVersion()[0] != ZLIB_VERSION[0]) {
|
if (zlibVersion()[0] != myVersion[0]) {
|
||||||
fprintf(stderr, "incompatible zlib version\n");
|
fprintf(stderr, "incompatible zlib version\n");
|
||||||
exit(1);
|
exit(1);
|
||||||
|
|
||||||
@ -479,11 +532,10 @@ int main(argc, argv)
|
|||||||
printf("out of memory\n");
|
printf("out of memory\n");
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
test_compress(compr, comprLen, uncompr, uncomprLen);
|
test_compress(compr, comprLen, uncompr, uncomprLen);
|
||||||
|
|
||||||
test_gzio((argc > 1 ? argv[1] : "foo.gz"),
|
test_gzio((argc > 1 ? argv[1] : TESTFILE),
|
||||||
(argc > 2 ? argv[2] : "foo.gz"),
|
(argc > 2 ? argv[2] : TESTFILE),
|
||||||
uncompr, (int)uncomprLen);
|
uncompr, (int)uncomprLen);
|
||||||
|
|
||||||
test_deflate(compr, comprLen);
|
test_deflate(compr, comprLen);
|
||||||
@ -492,8 +544,9 @@ int main(argc, argv)
|
|||||||
test_large_deflate(compr, comprLen, uncompr, uncomprLen);
|
test_large_deflate(compr, comprLen, uncompr, uncomprLen);
|
||||||
test_large_inflate(compr, comprLen, uncompr, uncomprLen);
|
test_large_inflate(compr, comprLen, uncompr, uncomprLen);
|
||||||
|
|
||||||
test_flush(compr, comprLen);
|
test_flush(compr, &comprLen);
|
||||||
test_sync(compr, comprLen, uncompr, uncomprLen);
|
test_sync(compr, comprLen, uncompr, uncomprLen);
|
||||||
|
comprLen = uncomprLen;
|
||||||
|
|
||||||
test_dict_deflate(compr, comprLen);
|
test_dict_deflate(compr, comprLen);
|
||||||
test_dict_inflate(compr, comprLen, uncompr, uncomprLen);
|
test_dict_inflate(compr, comprLen, uncompr, uncomprLen);
|
||||||
|
@ -1,10 +1,11 @@
|
|||||||
/* gzio.c -- IO on .gz files
|
/* gzio.c -- IO on .gz files
|
||||||
* Copyright (C) 1995-1996 Jean-loup Gailly.
|
* Copyright (C) 1995-1998 Jean-loup Gailly.
|
||||||
* For conditions of distribution and use, see copyright notice in zlib.h
|
* For conditions of distribution and use, see copyright notice in zlib.h
|
||||||
|
*
|
||||||
|
* Compile this file with -DNO_DEFLATE to avoid the compression code.
|
||||||
*/
|
*/
|
||||||
/* This file was modified since it was taken from the zlib distribution */
|
|
||||||
|
|
||||||
/* $Id: gzio.c,v 3.2 1999/08/26 00:10:17 briano%netscape.com Exp $ */
|
/* @(#) $Id: gzio.c,v 3.3 2001/06/30 23:37:53 leaf%mozilla.org Exp $ */
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
@ -12,7 +13,16 @@
|
|||||||
|
|
||||||
struct internal_state {int dummy;}; /* for buggy compilers */
|
struct internal_state {int dummy;}; /* for buggy compilers */
|
||||||
|
|
||||||
#define Z_BUFSIZE 4096
|
#ifndef Z_BUFSIZE
|
||||||
|
# ifdef MAXSEG_64K
|
||||||
|
# define Z_BUFSIZE 4096 /* minimize memory usage for 16-bit DOS */
|
||||||
|
# else
|
||||||
|
# define Z_BUFSIZE 16384
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
#ifndef Z_PRINTF_BUFSIZE
|
||||||
|
# define Z_PRINTF_BUFSIZE 4096
|
||||||
|
#endif
|
||||||
|
|
||||||
#define ALLOC(size) malloc(size)
|
#define ALLOC(size) malloc(size)
|
||||||
#define TRYFREE(p) {if (p) free(p);}
|
#define TRYFREE(p) {if (p) free(p);}
|
||||||
@ -39,10 +49,12 @@ typedef struct gz_stream {
|
|||||||
char *path; /* path name for debugging only */
|
char *path; /* path name for debugging only */
|
||||||
int transparent; /* 1 if input file is not a .gz file */
|
int transparent; /* 1 if input file is not a .gz file */
|
||||||
char mode; /* 'w' or 'r' */
|
char mode; /* 'w' or 'r' */
|
||||||
|
long startpos; /* start of compressed data in file (header skipped) */
|
||||||
} gz_stream;
|
} gz_stream;
|
||||||
|
|
||||||
|
|
||||||
local gzFile gz_open OF((const char *path, const char *mode, int fd));
|
local gzFile gz_open OF((const char *path, const char *mode, int fd));
|
||||||
|
local int do_flush OF((gzFile file, int flush));
|
||||||
local int get_byte OF((gz_stream *s));
|
local int get_byte OF((gz_stream *s));
|
||||||
local void check_header OF((gz_stream *s));
|
local void check_header OF((gz_stream *s));
|
||||||
local int destroy OF((gz_stream *s));
|
local int destroy OF((gz_stream *s));
|
||||||
@ -65,6 +77,7 @@ local gzFile gz_open (path, mode, fd)
|
|||||||
{
|
{
|
||||||
int err;
|
int err;
|
||||||
int level = Z_DEFAULT_COMPRESSION; /* compression level */
|
int level = Z_DEFAULT_COMPRESSION; /* compression level */
|
||||||
|
int strategy = Z_DEFAULT_STRATEGY; /* compression strategy */
|
||||||
char *p = (char*)mode;
|
char *p = (char*)mode;
|
||||||
gz_stream *s;
|
gz_stream *s;
|
||||||
char fmode[80]; /* copy of mode, without the compression level */
|
char fmode[80]; /* copy of mode, without the compression level */
|
||||||
@ -100,6 +113,10 @@ local gzFile gz_open (path, mode, fd)
|
|||||||
if (*p == 'w' || *p == 'a') s->mode = 'w';
|
if (*p == 'w' || *p == 'a') s->mode = 'w';
|
||||||
if (*p >= '0' && *p <= '9') {
|
if (*p >= '0' && *p <= '9') {
|
||||||
level = *p - '0';
|
level = *p - '0';
|
||||||
|
} else if (*p == 'f') {
|
||||||
|
strategy = Z_FILTERED;
|
||||||
|
} else if (*p == 'h') {
|
||||||
|
strategy = Z_HUFFMAN_ONLY;
|
||||||
} else {
|
} else {
|
||||||
*m++ = *p; /* copy the mode */
|
*m++ = *p; /* copy the mode */
|
||||||
}
|
}
|
||||||
@ -107,19 +124,28 @@ local gzFile gz_open (path, mode, fd)
|
|||||||
if (s->mode == '\0') return destroy(s), (gzFile)Z_NULL;
|
if (s->mode == '\0') return destroy(s), (gzFile)Z_NULL;
|
||||||
|
|
||||||
if (s->mode == 'w') {
|
if (s->mode == 'w') {
|
||||||
|
#ifdef NO_DEFLATE
|
||||||
|
err = Z_STREAM_ERROR;
|
||||||
|
#else
|
||||||
err = deflateInit2(&(s->stream), level,
|
err = deflateInit2(&(s->stream), level,
|
||||||
Z_DEFLATED, -MAX_WBITS, DEF_MEM_LEVEL, 0);
|
Z_DEFLATED, -MAX_WBITS, DEF_MEM_LEVEL, strategy);
|
||||||
/* windowBits is passed < 0 to suppress zlib header */
|
/* windowBits is passed < 0 to suppress zlib header */
|
||||||
|
|
||||||
s->stream.next_out = s->outbuf = (Byte*)ALLOC(Z_BUFSIZE);
|
s->stream.next_out = s->outbuf = (Byte*)ALLOC(Z_BUFSIZE);
|
||||||
|
#endif
|
||||||
if (err != Z_OK || s->outbuf == Z_NULL) {
|
if (err != Z_OK || s->outbuf == Z_NULL) {
|
||||||
return destroy(s), (gzFile)Z_NULL;
|
return destroy(s), (gzFile)Z_NULL;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
err = inflateInit2(&(s->stream), -MAX_WBITS);
|
|
||||||
s->stream.next_in = s->inbuf = (Byte*)ALLOC(Z_BUFSIZE);
|
s->stream.next_in = s->inbuf = (Byte*)ALLOC(Z_BUFSIZE);
|
||||||
|
|
||||||
|
err = inflateInit2(&(s->stream), -MAX_WBITS);
|
||||||
|
/* windowBits is passed < 0 to tell that there is no zlib header.
|
||||||
|
* Note that in this case inflate *requires* an extra "dummy" byte
|
||||||
|
* after the compressed stream in order to complete decompression and
|
||||||
|
* return Z_STREAM_END. Here the gzip CRC32 ensures that 4 bytes are
|
||||||
|
* present after the compressed stream.
|
||||||
|
*/
|
||||||
if (err != Z_OK || s->inbuf == Z_NULL) {
|
if (err != Z_OK || s->inbuf == Z_NULL) {
|
||||||
return destroy(s), (gzFile)Z_NULL;
|
return destroy(s), (gzFile)Z_NULL;
|
||||||
}
|
}
|
||||||
@ -127,7 +153,7 @@ local gzFile gz_open (path, mode, fd)
|
|||||||
s->stream.avail_out = Z_BUFSIZE;
|
s->stream.avail_out = Z_BUFSIZE;
|
||||||
|
|
||||||
errno = 0;
|
errno = 0;
|
||||||
s->file = fd < 0 ? FOPEN(path, fmode) : (FILE*)fdopen(fd, fmode);
|
s->file = fd < 0 ? F_OPEN(path, fmode) : (FILE*)fdopen(fd, fmode);
|
||||||
|
|
||||||
if (s->file == NULL) {
|
if (s->file == NULL) {
|
||||||
return destroy(s), (gzFile)Z_NULL;
|
return destroy(s), (gzFile)Z_NULL;
|
||||||
@ -137,20 +163,26 @@ local gzFile gz_open (path, mode, fd)
|
|||||||
*/
|
*/
|
||||||
fprintf(s->file, "%c%c%c%c%c%c%c%c%c%c", gz_magic[0], gz_magic[1],
|
fprintf(s->file, "%c%c%c%c%c%c%c%c%c%c", gz_magic[0], gz_magic[1],
|
||||||
Z_DEFLATED, 0 /*flags*/, 0,0,0,0 /*time*/, 0 /*xflags*/, OS_CODE);
|
Z_DEFLATED, 0 /*flags*/, 0,0,0,0 /*time*/, 0 /*xflags*/, OS_CODE);
|
||||||
|
s->startpos = 10L;
|
||||||
|
/* We use 10L instead of ftell(s->file) to because ftell causes an
|
||||||
|
* fflush on some systems. This version of the library doesn't use
|
||||||
|
* startpos anyway in write mode, so this initialization is not
|
||||||
|
* necessary.
|
||||||
|
*/
|
||||||
} else {
|
} else {
|
||||||
check_header(s); /* skip the .gz header */
|
check_header(s); /* skip the .gz header */
|
||||||
|
s->startpos = (ftell(s->file) - s->stream.avail_in);
|
||||||
}
|
}
|
||||||
|
|
||||||
return (gzFile)s;
|
return (gzFile)s;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ===========================================================================
|
/* ===========================================================================
|
||||||
Opens a gzip (.gz) file for reading or writing.
|
Opens a gzip (.gz) file for reading or writing.
|
||||||
*/
|
*/
|
||||||
#ifdef MOZILLA_CLIENT
|
gzFile ZEXPORT gzopen (path, mode)
|
||||||
PR_PUBLIC_API(extern gzFile) gzopen (const char *path, const char *mode)
|
const char *path;
|
||||||
#else
|
const char *mode;
|
||||||
extern gzFile EXPORT gzopen OF((const char *path, const char *mode))
|
|
||||||
#endif
|
|
||||||
{
|
{
|
||||||
return gz_open (path, mode, -1);
|
return gz_open (path, mode, -1);
|
||||||
}
|
}
|
||||||
@ -159,11 +191,9 @@ extern gzFile EXPORT gzopen OF((const char *path, const char *mode))
|
|||||||
Associate a gzFile with the file descriptor fd. fd is not dup'ed here
|
Associate a gzFile with the file descriptor fd. fd is not dup'ed here
|
||||||
to mimic the behavio(u)r of fdopen.
|
to mimic the behavio(u)r of fdopen.
|
||||||
*/
|
*/
|
||||||
#ifdef MOZILLA_CLIENT
|
gzFile ZEXPORT gzdopen (fd, mode)
|
||||||
PR_PUBLIC_API(extern gzFile) gzdopen (int fd, const char *mode)
|
int fd;
|
||||||
#else
|
const char *mode;
|
||||||
extern gzFile EXPORT gzdopen OF((int fd, const char *mode))
|
|
||||||
#endif
|
|
||||||
{
|
{
|
||||||
char name[20];
|
char name[20];
|
||||||
|
|
||||||
@ -173,6 +203,31 @@ extern gzFile EXPORT gzdopen OF((int fd, const char *mode))
|
|||||||
return gz_open (name, mode, fd);
|
return gz_open (name, mode, fd);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* ===========================================================================
|
||||||
|
* Update the compression level and strategy
|
||||||
|
*/
|
||||||
|
int ZEXPORT gzsetparams (file, level, strategy)
|
||||||
|
gzFile file;
|
||||||
|
int level;
|
||||||
|
int strategy;
|
||||||
|
{
|
||||||
|
gz_stream *s = (gz_stream*)file;
|
||||||
|
|
||||||
|
if (s == NULL || s->mode != 'w') return Z_STREAM_ERROR;
|
||||||
|
|
||||||
|
/* Make room to allow flushing */
|
||||||
|
if (s->stream.avail_out == 0) {
|
||||||
|
|
||||||
|
s->stream.next_out = s->outbuf;
|
||||||
|
if (fwrite(s->outbuf, 1, Z_BUFSIZE, s->file) != Z_BUFSIZE) {
|
||||||
|
s->z_err = Z_ERRNO;
|
||||||
|
}
|
||||||
|
s->stream.avail_out = Z_BUFSIZE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return deflateParams (&(s->stream), level, strategy);
|
||||||
|
}
|
||||||
|
|
||||||
/* ===========================================================================
|
/* ===========================================================================
|
||||||
Read a byte from a gz_stream; update next_in and avail_in. Return EOF
|
Read a byte from a gz_stream; update next_in and avail_in. Return EOF
|
||||||
for end of file.
|
for end of file.
|
||||||
@ -217,8 +272,11 @@ local void check_header(s)
|
|||||||
for (len = 0; len < 2; len++) {
|
for (len = 0; len < 2; len++) {
|
||||||
c = get_byte(s);
|
c = get_byte(s);
|
||||||
if (c != gz_magic[len]) {
|
if (c != gz_magic[len]) {
|
||||||
s->transparent = 1;
|
if (len != 0) s->stream.avail_in++, s->stream.next_in--;
|
||||||
if (c != EOF) s->stream.avail_in++, s->stream.next_in--;
|
if (c != EOF) {
|
||||||
|
s->stream.avail_in++, s->stream.next_in--;
|
||||||
|
s->transparent = 1;
|
||||||
|
}
|
||||||
s->z_err = s->stream.avail_in != 0 ? Z_OK : Z_STREAM_END;
|
s->z_err = s->stream.avail_in != 0 ? Z_OK : Z_STREAM_END;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -265,14 +323,21 @@ local int destroy (s)
|
|||||||
TRYFREE(s->msg);
|
TRYFREE(s->msg);
|
||||||
|
|
||||||
if (s->stream.state != NULL) {
|
if (s->stream.state != NULL) {
|
||||||
if (s->mode == 'w') {
|
if (s->mode == 'w') {
|
||||||
err = deflateEnd(&(s->stream));
|
#ifdef NO_DEFLATE
|
||||||
} else if (s->mode == 'r') {
|
err = Z_STREAM_ERROR;
|
||||||
err = inflateEnd(&(s->stream));
|
#else
|
||||||
}
|
err = deflateEnd(&(s->stream));
|
||||||
|
#endif
|
||||||
|
} else if (s->mode == 'r') {
|
||||||
|
err = inflateEnd(&(s->stream));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (s->file != NULL && fclose(s->file)) {
|
if (s->file != NULL && fclose(s->file)) {
|
||||||
err = Z_ERRNO;
|
#ifdef ESPIPE
|
||||||
|
if (errno != ESPIPE) /* fclose is broken for pipes in HP/UX */
|
||||||
|
#endif
|
||||||
|
err = Z_ERRNO;
|
||||||
}
|
}
|
||||||
if (s->z_err < 0) err = s->z_err;
|
if (s->z_err < 0) err = s->z_err;
|
||||||
|
|
||||||
@ -287,14 +352,13 @@ local int destroy (s)
|
|||||||
Reads the given number of uncompressed bytes from the compressed file.
|
Reads the given number of uncompressed bytes from the compressed file.
|
||||||
gzread returns the number of bytes actually read (0 for end of file).
|
gzread returns the number of bytes actually read (0 for end of file).
|
||||||
*/
|
*/
|
||||||
#ifdef MOZILLA_CLIENT
|
int ZEXPORT gzread (file, buf, len)
|
||||||
PR_PUBLIC_API(extern int) gzread (gzFile file, voidp buf, unsigned len)
|
gzFile file;
|
||||||
#else
|
voidp buf;
|
||||||
extern int EXPORT gzread OF((gzFile file, voidp buf, unsigned len))
|
unsigned len;
|
||||||
#endif
|
|
||||||
{
|
{
|
||||||
gz_stream *s = (gz_stream*)file;
|
gz_stream *s = (gz_stream*)file;
|
||||||
Bytef *start = buf; /* starting point for crc computation */
|
Bytef *start = (Bytef*)buf; /* starting point for crc computation */
|
||||||
Byte *next_out; /* == stream.next_out but not forced far (for MSDOS) */
|
Byte *next_out; /* == stream.next_out but not forced far (for MSDOS) */
|
||||||
|
|
||||||
if (s == NULL || s->mode != 'r') return Z_STREAM_ERROR;
|
if (s == NULL || s->mode != 'r') return Z_STREAM_ERROR;
|
||||||
@ -302,7 +366,8 @@ extern int EXPORT gzread OF((gzFile file, voidp buf, unsigned len))
|
|||||||
if (s->z_err == Z_DATA_ERROR || s->z_err == Z_ERRNO) return -1;
|
if (s->z_err == Z_DATA_ERROR || s->z_err == Z_ERRNO) return -1;
|
||||||
if (s->z_err == Z_STREAM_END) return 0; /* EOF */
|
if (s->z_err == Z_STREAM_END) return 0; /* EOF */
|
||||||
|
|
||||||
s->stream.next_out = next_out = buf;
|
next_out = (Byte*)buf;
|
||||||
|
s->stream.next_out = (Bytef*)buf;
|
||||||
s->stream.avail_out = len;
|
s->stream.avail_out = len;
|
||||||
|
|
||||||
while (s->stream.avail_out != 0) {
|
while (s->stream.avail_out != 0) {
|
||||||
@ -323,7 +388,11 @@ extern int EXPORT gzread OF((gzFile file, voidp buf, unsigned len))
|
|||||||
s->stream.avail_out -= fread(next_out, 1, s->stream.avail_out,
|
s->stream.avail_out -= fread(next_out, 1, s->stream.avail_out,
|
||||||
s->file);
|
s->file);
|
||||||
}
|
}
|
||||||
return (int)(len - s->stream.avail_out);
|
len -= s->stream.avail_out;
|
||||||
|
s->stream.total_in += (uLong)len;
|
||||||
|
s->stream.total_out += (uLong)len;
|
||||||
|
if (len == 0) s->z_eof = 1;
|
||||||
|
return (int)len;
|
||||||
}
|
}
|
||||||
if (s->stream.avail_in == 0 && !s->z_eof) {
|
if (s->stream.avail_in == 0 && !s->z_eof) {
|
||||||
|
|
||||||
@ -345,13 +414,22 @@ extern int EXPORT gzread OF((gzFile file, voidp buf, unsigned len))
|
|||||||
s->crc = crc32(s->crc, start, (uInt)(s->stream.next_out - start));
|
s->crc = crc32(s->crc, start, (uInt)(s->stream.next_out - start));
|
||||||
start = s->stream.next_out;
|
start = s->stream.next_out;
|
||||||
|
|
||||||
if (getLong(s) != s->crc || getLong(s) != s->stream.total_out) {
|
if (getLong(s) != s->crc) {
|
||||||
s->z_err = Z_DATA_ERROR;
|
s->z_err = Z_DATA_ERROR;
|
||||||
} else {
|
} else {
|
||||||
/* Check for concatenated .gz files: */
|
(void)getLong(s);
|
||||||
|
/* The uncompressed length returned by above getlong() may
|
||||||
|
* be different from s->stream.total_out) in case of
|
||||||
|
* concatenated .gz files. Check for such files:
|
||||||
|
*/
|
||||||
check_header(s);
|
check_header(s);
|
||||||
if (s->z_err == Z_OK) {
|
if (s->z_err == Z_OK) {
|
||||||
|
uLong total_in = s->stream.total_in;
|
||||||
|
uLong total_out = s->stream.total_out;
|
||||||
|
|
||||||
inflateReset(&(s->stream));
|
inflateReset(&(s->stream));
|
||||||
|
s->stream.total_in = total_in;
|
||||||
|
s->stream.total_out = total_out;
|
||||||
s->crc = crc32(0L, Z_NULL, 0);
|
s->crc = crc32(0L, Z_NULL, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -363,21 +441,58 @@ extern int EXPORT gzread OF((gzFile file, voidp buf, unsigned len))
|
|||||||
return (int)(len - s->stream.avail_out);
|
return (int)(len - s->stream.avail_out);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* ===========================================================================
|
||||||
|
Reads one byte from the compressed file. gzgetc returns this byte
|
||||||
|
or -1 in case of end of file or error.
|
||||||
|
*/
|
||||||
|
int ZEXPORT gzgetc(file)
|
||||||
|
gzFile file;
|
||||||
|
{
|
||||||
|
unsigned char c;
|
||||||
|
|
||||||
|
return gzread(file, &c, 1) == 1 ? c : -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* ===========================================================================
|
||||||
|
Reads bytes from the compressed file until len-1 characters are
|
||||||
|
read, or a newline character is read and transferred to buf, or an
|
||||||
|
end-of-file condition is encountered. The string is then terminated
|
||||||
|
with a null character.
|
||||||
|
gzgets returns buf, or Z_NULL in case of error.
|
||||||
|
|
||||||
|
The current implementation is not optimized at all.
|
||||||
|
*/
|
||||||
|
char * ZEXPORT gzgets(file, buf, len)
|
||||||
|
gzFile file;
|
||||||
|
char *buf;
|
||||||
|
int len;
|
||||||
|
{
|
||||||
|
char *b = buf;
|
||||||
|
if (buf == Z_NULL || len <= 0) return Z_NULL;
|
||||||
|
|
||||||
|
while (--len > 0 && gzread(file, buf, 1) == 1 && *buf++ != '\n') ;
|
||||||
|
*buf = '\0';
|
||||||
|
return b == buf && len > 0 ? Z_NULL : b;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef NO_DEFLATE
|
||||||
/* ===========================================================================
|
/* ===========================================================================
|
||||||
Writes the given number of uncompressed bytes into the compressed file.
|
Writes the given number of uncompressed bytes into the compressed file.
|
||||||
gzwrite returns the number of bytes actually written (0 in case of error).
|
gzwrite returns the number of bytes actually written (0 in case of error).
|
||||||
*/
|
*/
|
||||||
#ifdef MOZILLA_CLIENT
|
int ZEXPORT gzwrite (file, buf, len)
|
||||||
PR_PUBLIC_API(extern int) gzwrite (gzFile file, const voidp buf, unsigned len)
|
gzFile file;
|
||||||
#else
|
const voidp buf;
|
||||||
extern int EXPORT gzwrite OF((gzFile file, const voidp buf, unsigned len))
|
unsigned len;
|
||||||
#endif
|
|
||||||
{
|
{
|
||||||
gz_stream *s = (gz_stream*)file;
|
gz_stream *s = (gz_stream*)file;
|
||||||
|
|
||||||
if (s == NULL || s->mode != 'w') return Z_STREAM_ERROR;
|
if (s == NULL || s->mode != 'w') return Z_STREAM_ERROR;
|
||||||
|
|
||||||
s->stream.next_in = buf;
|
s->stream.next_in = (Bytef*)buf;
|
||||||
s->stream.avail_in = len;
|
s->stream.avail_in = len;
|
||||||
|
|
||||||
while (s->stream.avail_in != 0) {
|
while (s->stream.avail_in != 0) {
|
||||||
@ -394,22 +509,97 @@ extern int EXPORT gzwrite OF((gzFile file, const voidp buf, unsigned len))
|
|||||||
s->z_err = deflate(&(s->stream), Z_NO_FLUSH);
|
s->z_err = deflate(&(s->stream), Z_NO_FLUSH);
|
||||||
if (s->z_err != Z_OK) break;
|
if (s->z_err != Z_OK) break;
|
||||||
}
|
}
|
||||||
s->crc = crc32(s->crc, buf, len);
|
s->crc = crc32(s->crc, (const Bytef *)buf, len);
|
||||||
|
|
||||||
return (int)(len - s->stream.avail_in);
|
return (int)(len - s->stream.avail_in);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* ===========================================================================
|
||||||
|
Converts, formats, and writes the args to the compressed file under
|
||||||
|
control of the format string, as in fprintf. gzprintf returns the number of
|
||||||
|
uncompressed bytes actually written (0 in case of error).
|
||||||
|
*/
|
||||||
|
#ifdef STDC
|
||||||
|
#include <stdarg.h>
|
||||||
|
|
||||||
|
int ZEXPORTVA gzprintf (gzFile file, const char *format, /* args */ ...)
|
||||||
|
{
|
||||||
|
char buf[Z_PRINTF_BUFSIZE];
|
||||||
|
va_list va;
|
||||||
|
int len;
|
||||||
|
|
||||||
|
va_start(va, format);
|
||||||
|
#ifdef HAS_vsnprintf
|
||||||
|
(void)vsnprintf(buf, sizeof(buf), format, va);
|
||||||
|
#else
|
||||||
|
(void)vsprintf(buf, format, va);
|
||||||
|
#endif
|
||||||
|
va_end(va);
|
||||||
|
len = strlen(buf); /* some *sprintf don't return the nb of bytes written */
|
||||||
|
if (len <= 0) return 0;
|
||||||
|
|
||||||
|
return gzwrite(file, buf, (unsigned)len);
|
||||||
|
}
|
||||||
|
#else /* not ANSI C */
|
||||||
|
|
||||||
|
int ZEXPORTVA gzprintf (file, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10,
|
||||||
|
a11, a12, a13, a14, a15, a16, a17, a18, a19, a20)
|
||||||
|
gzFile file;
|
||||||
|
const char *format;
|
||||||
|
int a1, a2, a3, a4, a5, a6, a7, a8, a9, a10,
|
||||||
|
a11, a12, a13, a14, a15, a16, a17, a18, a19, a20;
|
||||||
|
{
|
||||||
|
char buf[Z_PRINTF_BUFSIZE];
|
||||||
|
int len;
|
||||||
|
|
||||||
|
#ifdef HAS_snprintf
|
||||||
|
snprintf(buf, sizeof(buf), format, a1, a2, a3, a4, a5, a6, a7, a8,
|
||||||
|
a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20);
|
||||||
|
#else
|
||||||
|
sprintf(buf, format, a1, a2, a3, a4, a5, a6, a7, a8,
|
||||||
|
a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20);
|
||||||
|
#endif
|
||||||
|
len = strlen(buf); /* old sprintf doesn't return the nb of bytes written */
|
||||||
|
if (len <= 0) return 0;
|
||||||
|
|
||||||
|
return gzwrite(file, buf, len);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* ===========================================================================
|
||||||
|
Writes c, converted to an unsigned char, into the compressed file.
|
||||||
|
gzputc returns the value that was written, or -1 in case of error.
|
||||||
|
*/
|
||||||
|
int ZEXPORT gzputc(file, c)
|
||||||
|
gzFile file;
|
||||||
|
int c;
|
||||||
|
{
|
||||||
|
unsigned char cc = (unsigned char) c; /* required for big endian systems */
|
||||||
|
|
||||||
|
return gzwrite(file, &cc, 1) == 1 ? (int)cc : -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* ===========================================================================
|
||||||
|
Writes the given null-terminated string to the compressed file, excluding
|
||||||
|
the terminating null character.
|
||||||
|
gzputs returns the number of characters written, or -1 in case of error.
|
||||||
|
*/
|
||||||
|
int ZEXPORT gzputs(file, s)
|
||||||
|
gzFile file;
|
||||||
|
const char *s;
|
||||||
|
{
|
||||||
|
return gzwrite(file, (char*)s, (unsigned)strlen(s));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* ===========================================================================
|
/* ===========================================================================
|
||||||
Flushes all pending output into the compressed file. The parameter
|
Flushes all pending output into the compressed file. The parameter
|
||||||
flush is as in the deflate() function.
|
flush is as in the deflate() function.
|
||||||
gzflush should be called only when strictly necessary because it can
|
|
||||||
degrade compression.
|
|
||||||
*/
|
*/
|
||||||
#ifdef MOZILLA_CLIENT
|
local int do_flush (file, flush)
|
||||||
PR_PUBLIC_API(extern int) gzflush (gzFile file, int flush)
|
gzFile file;
|
||||||
#else
|
int flush;
|
||||||
extern int EXPORT gzflush OF((gzFile file, int flush))
|
|
||||||
#endif
|
|
||||||
{
|
{
|
||||||
uInt len;
|
uInt len;
|
||||||
int done = 0;
|
int done = 0;
|
||||||
@ -433,6 +623,9 @@ extern int EXPORT gzflush OF((gzFile file, int flush))
|
|||||||
if (done) break;
|
if (done) break;
|
||||||
s->z_err = deflate(&(s->stream), flush);
|
s->z_err = deflate(&(s->stream), flush);
|
||||||
|
|
||||||
|
/* Ignore the second of two consecutive flushes: */
|
||||||
|
if (len == 0 && s->z_err == Z_BUF_ERROR) s->z_err = Z_OK;
|
||||||
|
|
||||||
/* deflate has finished flushing only when it hasn't used up
|
/* deflate has finished flushing only when it hasn't used up
|
||||||
* all the available space in the output buffer:
|
* all the available space in the output buffer:
|
||||||
*/
|
*/
|
||||||
@ -440,9 +633,155 @@ extern int EXPORT gzflush OF((gzFile file, int flush))
|
|||||||
|
|
||||||
if (s->z_err != Z_OK && s->z_err != Z_STREAM_END) break;
|
if (s->z_err != Z_OK && s->z_err != Z_STREAM_END) break;
|
||||||
}
|
}
|
||||||
|
return s->z_err == Z_STREAM_END ? Z_OK : s->z_err;
|
||||||
|
}
|
||||||
|
|
||||||
|
int ZEXPORT gzflush (file, flush)
|
||||||
|
gzFile file;
|
||||||
|
int flush;
|
||||||
|
{
|
||||||
|
gz_stream *s = (gz_stream*)file;
|
||||||
|
int err = do_flush (file, flush);
|
||||||
|
|
||||||
|
if (err) return err;
|
||||||
fflush(s->file);
|
fflush(s->file);
|
||||||
return s->z_err == Z_STREAM_END ? Z_OK : s->z_err;
|
return s->z_err == Z_STREAM_END ? Z_OK : s->z_err;
|
||||||
}
|
}
|
||||||
|
#endif /* NO_DEFLATE */
|
||||||
|
|
||||||
|
/* ===========================================================================
|
||||||
|
Sets the starting position for the next gzread or gzwrite on the given
|
||||||
|
compressed file. The offset represents a number of bytes in the
|
||||||
|
gzseek returns the resulting offset location as measured in bytes from
|
||||||
|
the beginning of the uncompressed stream, or -1 in case of error.
|
||||||
|
SEEK_END is not implemented, returns error.
|
||||||
|
In this version of the library, gzseek can be extremely slow.
|
||||||
|
*/
|
||||||
|
z_off_t ZEXPORT gzseek (file, offset, whence)
|
||||||
|
gzFile file;
|
||||||
|
z_off_t offset;
|
||||||
|
int whence;
|
||||||
|
{
|
||||||
|
gz_stream *s = (gz_stream*)file;
|
||||||
|
|
||||||
|
if (s == NULL || whence == SEEK_END ||
|
||||||
|
s->z_err == Z_ERRNO || s->z_err == Z_DATA_ERROR) {
|
||||||
|
return -1L;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (s->mode == 'w') {
|
||||||
|
#ifdef NO_DEFLATE
|
||||||
|
return -1L;
|
||||||
|
#else
|
||||||
|
if (whence == SEEK_SET) {
|
||||||
|
offset -= s->stream.total_in;
|
||||||
|
}
|
||||||
|
if (offset < 0) return -1L;
|
||||||
|
|
||||||
|
/* At this point, offset is the number of zero bytes to write. */
|
||||||
|
if (s->inbuf == Z_NULL) {
|
||||||
|
s->inbuf = (Byte*)ALLOC(Z_BUFSIZE); /* for seeking */
|
||||||
|
zmemzero(s->inbuf, Z_BUFSIZE);
|
||||||
|
}
|
||||||
|
while (offset > 0) {
|
||||||
|
uInt size = Z_BUFSIZE;
|
||||||
|
if (offset < Z_BUFSIZE) size = (uInt)offset;
|
||||||
|
|
||||||
|
size = gzwrite(file, s->inbuf, size);
|
||||||
|
if (size == 0) return -1L;
|
||||||
|
|
||||||
|
offset -= size;
|
||||||
|
}
|
||||||
|
return (z_off_t)s->stream.total_in;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
/* Rest of function is for reading only */
|
||||||
|
|
||||||
|
/* compute absolute position */
|
||||||
|
if (whence == SEEK_CUR) {
|
||||||
|
offset += s->stream.total_out;
|
||||||
|
}
|
||||||
|
if (offset < 0) return -1L;
|
||||||
|
|
||||||
|
if (s->transparent) {
|
||||||
|
/* map to fseek */
|
||||||
|
s->stream.avail_in = 0;
|
||||||
|
s->stream.next_in = s->inbuf;
|
||||||
|
if (fseek(s->file, offset, SEEK_SET) < 0) return -1L;
|
||||||
|
|
||||||
|
s->stream.total_in = s->stream.total_out = (uLong)offset;
|
||||||
|
return offset;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* For a negative seek, rewind and use positive seek */
|
||||||
|
if ((uLong)offset >= s->stream.total_out) {
|
||||||
|
offset -= s->stream.total_out;
|
||||||
|
} else if (gzrewind(file) < 0) {
|
||||||
|
return -1L;
|
||||||
|
}
|
||||||
|
/* offset is now the number of bytes to skip. */
|
||||||
|
|
||||||
|
if (offset != 0 && s->outbuf == Z_NULL) {
|
||||||
|
s->outbuf = (Byte*)ALLOC(Z_BUFSIZE);
|
||||||
|
}
|
||||||
|
while (offset > 0) {
|
||||||
|
int size = Z_BUFSIZE;
|
||||||
|
if (offset < Z_BUFSIZE) size = (int)offset;
|
||||||
|
|
||||||
|
size = gzread(file, s->outbuf, (uInt)size);
|
||||||
|
if (size <= 0) return -1L;
|
||||||
|
offset -= size;
|
||||||
|
}
|
||||||
|
return (z_off_t)s->stream.total_out;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ===========================================================================
|
||||||
|
Rewinds input file.
|
||||||
|
*/
|
||||||
|
int ZEXPORT gzrewind (file)
|
||||||
|
gzFile file;
|
||||||
|
{
|
||||||
|
gz_stream *s = (gz_stream*)file;
|
||||||
|
|
||||||
|
if (s == NULL || s->mode != 'r') return -1;
|
||||||
|
|
||||||
|
s->z_err = Z_OK;
|
||||||
|
s->z_eof = 0;
|
||||||
|
s->stream.avail_in = 0;
|
||||||
|
s->stream.next_in = s->inbuf;
|
||||||
|
s->crc = crc32(0L, Z_NULL, 0);
|
||||||
|
|
||||||
|
if (s->startpos == 0) { /* not a compressed file */
|
||||||
|
rewind(s->file);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
(void) inflateReset(&s->stream);
|
||||||
|
return fseek(s->file, s->startpos, SEEK_SET);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ===========================================================================
|
||||||
|
Returns the starting position for the next gzread or gzwrite on the
|
||||||
|
given compressed file. This position represents a number of bytes in the
|
||||||
|
uncompressed data stream.
|
||||||
|
*/
|
||||||
|
z_off_t ZEXPORT gztell (file)
|
||||||
|
gzFile file;
|
||||||
|
{
|
||||||
|
return gzseek(file, 0L, SEEK_CUR);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ===========================================================================
|
||||||
|
Returns 1 when EOF has previously been detected reading the given
|
||||||
|
input stream, otherwise zero.
|
||||||
|
*/
|
||||||
|
int ZEXPORT gzeof (file)
|
||||||
|
gzFile file;
|
||||||
|
{
|
||||||
|
gz_stream *s = (gz_stream*)file;
|
||||||
|
|
||||||
|
return (s == NULL || s->mode != 'r') ? 0 : s->z_eof;
|
||||||
|
}
|
||||||
|
|
||||||
/* ===========================================================================
|
/* ===========================================================================
|
||||||
Outputs a long in LSB order to the given file
|
Outputs a long in LSB order to the given file
|
||||||
@ -459,7 +798,8 @@ local void putLong (file, x)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* ===========================================================================
|
/* ===========================================================================
|
||||||
Reads a long in LSB order from the given gz_stream. Sets
|
Reads a long in LSB order from the given gz_stream. Sets z_err in case
|
||||||
|
of error.
|
||||||
*/
|
*/
|
||||||
local uLong getLong (s)
|
local uLong getLong (s)
|
||||||
gz_stream *s;
|
gz_stream *s;
|
||||||
@ -479,11 +819,8 @@ local uLong getLong (s)
|
|||||||
Flushes all pending output if necessary, closes the compressed file
|
Flushes all pending output if necessary, closes the compressed file
|
||||||
and deallocates all the (de)compression state.
|
and deallocates all the (de)compression state.
|
||||||
*/
|
*/
|
||||||
#ifdef MOZILLA_CLIENT
|
int ZEXPORT gzclose (file)
|
||||||
PR_PUBLIC_API(extern int) gzclose (gzFile file)
|
gzFile file;
|
||||||
#else
|
|
||||||
extern int EXPORT gzclose OF((gzFile file))
|
|
||||||
#endif
|
|
||||||
{
|
{
|
||||||
int err;
|
int err;
|
||||||
gz_stream *s = (gz_stream*)file;
|
gz_stream *s = (gz_stream*)file;
|
||||||
@ -491,14 +828,17 @@ extern int EXPORT gzclose OF((gzFile file))
|
|||||||
if (s == NULL) return Z_STREAM_ERROR;
|
if (s == NULL) return Z_STREAM_ERROR;
|
||||||
|
|
||||||
if (s->mode == 'w') {
|
if (s->mode == 'w') {
|
||||||
err = gzflush (file, Z_FINISH);
|
#ifdef NO_DEFLATE
|
||||||
if (err != Z_OK) return destroy(file);
|
return Z_STREAM_ERROR;
|
||||||
|
#else
|
||||||
|
err = do_flush (file, Z_FINISH);
|
||||||
|
if (err != Z_OK) return destroy((gz_stream*)file);
|
||||||
|
|
||||||
putLong (s->file, s->crc);
|
putLong (s->file, s->crc);
|
||||||
putLong (s->file, s->stream.total_in);
|
putLong (s->file, s->stream.total_in);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
return destroy(file);
|
return destroy((gz_stream*)file);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ===========================================================================
|
/* ===========================================================================
|
||||||
@ -508,11 +848,9 @@ extern int EXPORT gzclose OF((gzFile file))
|
|||||||
errnum is set to Z_ERRNO and the application may consult errno
|
errnum is set to Z_ERRNO and the application may consult errno
|
||||||
to get the exact error code.
|
to get the exact error code.
|
||||||
*/
|
*/
|
||||||
#ifdef MOZILLA_CLIENT
|
const char* ZEXPORT gzerror (file, errnum)
|
||||||
PR_PUBLIC_API(extern const char *) gzerror (gzFile file, int *errnum)
|
gzFile file;
|
||||||
#else
|
int *errnum;
|
||||||
extern const char * EXPORT gzerror OF((gzFile file, int *errnum))
|
|
||||||
#endif
|
|
||||||
{
|
{
|
||||||
char *m;
|
char *m;
|
||||||
gz_stream *s = (gz_stream*)file;
|
gz_stream *s = (gz_stream*)file;
|
||||||
|
@ -1,8 +1,7 @@
|
|||||||
/* infblock.c -- interpret and process block types to last block
|
/* infblock.c -- interpret and process block types to last block
|
||||||
* Copyright (C) 1995-1996 Mark Adler
|
* Copyright (C) 1995-1998 Mark Adler
|
||||||
* For conditions of distribution and use, see copyright notice in zlib.h
|
* For conditions of distribution and use, see copyright notice in zlib.h
|
||||||
*/
|
*/
|
||||||
/* This file was modified since it was taken from the zlib distribution */
|
|
||||||
|
|
||||||
#include "zutil.h"
|
#include "zutil.h"
|
||||||
#include "infblock.h"
|
#include "infblock.h"
|
||||||
@ -12,8 +11,12 @@
|
|||||||
|
|
||||||
struct inflate_codes_state {int dummy;}; /* for buggy compilers */
|
struct inflate_codes_state {int dummy;}; /* for buggy compilers */
|
||||||
|
|
||||||
|
/* simplify the use of the inflate_huft type with some defines */
|
||||||
|
#define exop word.what.Exop
|
||||||
|
#define bits word.what.Bits
|
||||||
|
|
||||||
/* Table for deflate from PKZIP's appnote.txt. */
|
/* Table for deflate from PKZIP's appnote.txt. */
|
||||||
local uInt border[] = { /* Order of the bit length code lengths */
|
local const uInt border[] = { /* Order of the bit length code lengths */
|
||||||
16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15};
|
16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -67,23 +70,19 @@ inflate_blocks_statef *s;
|
|||||||
z_streamp z;
|
z_streamp z;
|
||||||
uLongf *c;
|
uLongf *c;
|
||||||
{
|
{
|
||||||
if (s->checkfn != Z_NULL)
|
if (c != Z_NULL)
|
||||||
*c = s->check;
|
*c = s->check;
|
||||||
if (s->mode == BTREE || s->mode == DTREE)
|
if (s->mode == BTREE || s->mode == DTREE)
|
||||||
ZFREE(z, s->sub.trees.blens);
|
ZFREE(z, s->sub.trees.blens);
|
||||||
if (s->mode == CODES)
|
if (s->mode == CODES)
|
||||||
{
|
|
||||||
inflate_codes_free(s->sub.decode.codes, z);
|
inflate_codes_free(s->sub.decode.codes, z);
|
||||||
inflate_trees_free(s->sub.decode.td, z);
|
|
||||||
inflate_trees_free(s->sub.decode.tl, z);
|
|
||||||
}
|
|
||||||
s->mode = TYPE;
|
s->mode = TYPE;
|
||||||
s->bitk = 0;
|
s->bitk = 0;
|
||||||
s->bitb = 0;
|
s->bitb = 0;
|
||||||
s->read = s->write = s->window;
|
s->read = s->write = s->window;
|
||||||
if (s->checkfn != Z_NULL)
|
if (s->checkfn != Z_NULL)
|
||||||
z->adler = s->check = (*s->checkfn)(0L, Z_NULL, 0);
|
z->adler = s->check = (*s->checkfn)(0L, (const Bytef *)Z_NULL, 0);
|
||||||
Trace((stderr, "inflate: blocks reset\n"));
|
Tracev((stderr, "inflate: blocks reset\n"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -97,23 +96,27 @@ uInt w;
|
|||||||
if ((s = (inflate_blocks_statef *)ZALLOC
|
if ((s = (inflate_blocks_statef *)ZALLOC
|
||||||
(z,1,sizeof(struct inflate_blocks_state))) == Z_NULL)
|
(z,1,sizeof(struct inflate_blocks_state))) == Z_NULL)
|
||||||
return s;
|
return s;
|
||||||
|
if ((s->hufts =
|
||||||
|
(inflate_huft *)ZALLOC(z, sizeof(inflate_huft), MANY)) == Z_NULL)
|
||||||
|
{
|
||||||
|
ZFREE(z, s);
|
||||||
|
return Z_NULL;
|
||||||
|
}
|
||||||
if ((s->window = (Bytef *)ZALLOC(z, 1, w)) == Z_NULL)
|
if ((s->window = (Bytef *)ZALLOC(z, 1, w)) == Z_NULL)
|
||||||
{
|
{
|
||||||
|
ZFREE(z, s->hufts);
|
||||||
ZFREE(z, s);
|
ZFREE(z, s);
|
||||||
return Z_NULL;
|
return Z_NULL;
|
||||||
}
|
}
|
||||||
s->end = s->window + w;
|
s->end = s->window + w;
|
||||||
s->checkfn = c;
|
s->checkfn = c;
|
||||||
s->mode = TYPE;
|
s->mode = TYPE;
|
||||||
Trace((stderr, "inflate: blocks allocated\n"));
|
Tracev((stderr, "inflate: blocks allocated\n"));
|
||||||
inflate_blocks_reset(s, z, &s->check);
|
inflate_blocks_reset(s, z, Z_NULL);
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#ifdef DEBUG
|
|
||||||
extern uInt inflate_hufts;
|
|
||||||
#endif
|
|
||||||
int inflate_blocks(s, z, r)
|
int inflate_blocks(s, z, r)
|
||||||
inflate_blocks_statef *s;
|
inflate_blocks_statef *s;
|
||||||
z_streamp z;
|
z_streamp z;
|
||||||
@ -140,7 +143,7 @@ int r;
|
|||||||
switch (t >> 1)
|
switch (t >> 1)
|
||||||
{
|
{
|
||||||
case 0: /* stored */
|
case 0: /* stored */
|
||||||
Trace((stderr, "inflate: stored block%s\n",
|
Tracev((stderr, "inflate: stored block%s\n",
|
||||||
s->last ? " (last)" : ""));
|
s->last ? " (last)" : ""));
|
||||||
DUMPBITS(3)
|
DUMPBITS(3)
|
||||||
t = k & 7; /* go to byte boundary */
|
t = k & 7; /* go to byte boundary */
|
||||||
@ -148,27 +151,25 @@ int r;
|
|||||||
s->mode = LENS; /* get length of stored block */
|
s->mode = LENS; /* get length of stored block */
|
||||||
break;
|
break;
|
||||||
case 1: /* fixed */
|
case 1: /* fixed */
|
||||||
Trace((stderr, "inflate: fixed codes block%s\n",
|
Tracev((stderr, "inflate: fixed codes block%s\n",
|
||||||
s->last ? " (last)" : ""));
|
s->last ? " (last)" : ""));
|
||||||
{
|
{
|
||||||
uInt bl, bd;
|
uInt bl, bd;
|
||||||
inflate_huft *tl, *td;
|
inflate_huft *tl, *td;
|
||||||
|
|
||||||
inflate_trees_fixed(&bl, &bd, &tl, &td);
|
inflate_trees_fixed(&bl, &bd, &tl, &td, z);
|
||||||
s->sub.decode.codes = inflate_codes_new(bl, bd, tl, td, z);
|
s->sub.decode.codes = inflate_codes_new(bl, bd, tl, td, z);
|
||||||
if (s->sub.decode.codes == Z_NULL)
|
if (s->sub.decode.codes == Z_NULL)
|
||||||
{
|
{
|
||||||
r = Z_MEM_ERROR;
|
r = Z_MEM_ERROR;
|
||||||
LEAVE
|
LEAVE
|
||||||
}
|
}
|
||||||
s->sub.decode.tl = Z_NULL; /* don't try to free these */
|
|
||||||
s->sub.decode.td = Z_NULL;
|
|
||||||
}
|
}
|
||||||
DUMPBITS(3)
|
DUMPBITS(3)
|
||||||
s->mode = CODES;
|
s->mode = CODES;
|
||||||
break;
|
break;
|
||||||
case 2: /* dynamic */
|
case 2: /* dynamic */
|
||||||
Trace((stderr, "inflate: dynamic codes block%s\n",
|
Tracev((stderr, "inflate: dynamic codes block%s\n",
|
||||||
s->last ? " (last)" : ""));
|
s->last ? " (last)" : ""));
|
||||||
DUMPBITS(3)
|
DUMPBITS(3)
|
||||||
s->mode = TABLE;
|
s->mode = TABLE;
|
||||||
@ -225,8 +226,6 @@ int r;
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
t = 258 + (t & 0x1f) + ((t >> 5) & 0x1f);
|
t = 258 + (t & 0x1f) + ((t >> 5) & 0x1f);
|
||||||
if (t < 19)
|
|
||||||
t = 19;
|
|
||||||
if ((s->sub.trees.blens = (uIntf*)ZALLOC(z, t, sizeof(uInt))) == Z_NULL)
|
if ((s->sub.trees.blens = (uIntf*)ZALLOC(z, t, sizeof(uInt))) == Z_NULL)
|
||||||
{
|
{
|
||||||
r = Z_MEM_ERROR;
|
r = Z_MEM_ERROR;
|
||||||
@ -247,10 +246,10 @@ int r;
|
|||||||
s->sub.trees.blens[border[s->sub.trees.index++]] = 0;
|
s->sub.trees.blens[border[s->sub.trees.index++]] = 0;
|
||||||
s->sub.trees.bb = 7;
|
s->sub.trees.bb = 7;
|
||||||
t = inflate_trees_bits(s->sub.trees.blens, &s->sub.trees.bb,
|
t = inflate_trees_bits(s->sub.trees.blens, &s->sub.trees.bb,
|
||||||
&s->sub.trees.tb, z);
|
&s->sub.trees.tb, s->hufts, z);
|
||||||
if (t != Z_OK)
|
if (t != Z_OK)
|
||||||
{
|
{
|
||||||
ZFREE(z, s->sub.trees.blens);
|
ZFREE(z, s->sub.trees.blens);
|
||||||
r = t;
|
r = t;
|
||||||
if (r == Z_DATA_ERROR)
|
if (r == Z_DATA_ERROR)
|
||||||
s->mode = BAD;
|
s->mode = BAD;
|
||||||
@ -269,8 +268,8 @@ int r;
|
|||||||
t = s->sub.trees.bb;
|
t = s->sub.trees.bb;
|
||||||
NEEDBITS(t)
|
NEEDBITS(t)
|
||||||
h = s->sub.trees.tb + ((uInt)b & inflate_mask[t]);
|
h = s->sub.trees.tb + ((uInt)b & inflate_mask[t]);
|
||||||
t = h->word.what.Bits;
|
t = h->bits;
|
||||||
c = h->more.Base;
|
c = h->base;
|
||||||
if (c < 16)
|
if (c < 16)
|
||||||
{
|
{
|
||||||
DUMPBITS(t)
|
DUMPBITS(t)
|
||||||
@ -289,8 +288,7 @@ int r;
|
|||||||
if (i + j > 258 + (t & 0x1f) + ((t >> 5) & 0x1f) ||
|
if (i + j > 258 + (t & 0x1f) + ((t >> 5) & 0x1f) ||
|
||||||
(c == 16 && i < 1))
|
(c == 16 && i < 1))
|
||||||
{
|
{
|
||||||
inflate_trees_free(s->sub.trees.tb, z);
|
ZFREE(z, s->sub.trees.blens);
|
||||||
ZFREE(z, s->sub.trees.blens);
|
|
||||||
s->mode = BAD;
|
s->mode = BAD;
|
||||||
z->msg = (char*)"invalid bit length repeat";
|
z->msg = (char*)"invalid bit length repeat";
|
||||||
r = Z_DATA_ERROR;
|
r = Z_DATA_ERROR;
|
||||||
@ -303,7 +301,6 @@ int r;
|
|||||||
s->sub.trees.index = i;
|
s->sub.trees.index = i;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
inflate_trees_free(s->sub.trees.tb, z);
|
|
||||||
s->sub.trees.tb = Z_NULL;
|
s->sub.trees.tb = Z_NULL;
|
||||||
{
|
{
|
||||||
uInt bl, bd;
|
uInt bl, bd;
|
||||||
@ -313,12 +310,10 @@ int r;
|
|||||||
bl = 9; /* must be <= 9 for lookahead assumptions */
|
bl = 9; /* must be <= 9 for lookahead assumptions */
|
||||||
bd = 6; /* must be <= 9 for lookahead assumptions */
|
bd = 6; /* must be <= 9 for lookahead assumptions */
|
||||||
t = s->sub.trees.table;
|
t = s->sub.trees.table;
|
||||||
#ifdef DEBUG
|
|
||||||
inflate_hufts = 0;
|
|
||||||
#endif
|
|
||||||
t = inflate_trees_dynamic(257 + (t & 0x1f), 1 + ((t >> 5) & 0x1f),
|
t = inflate_trees_dynamic(257 + (t & 0x1f), 1 + ((t >> 5) & 0x1f),
|
||||||
s->sub.trees.blens, &bl, &bd, &tl, &td, z);
|
s->sub.trees.blens, &bl, &bd, &tl, &td,
|
||||||
ZFREE(z, s->sub.trees.blens);
|
s->hufts, z);
|
||||||
|
ZFREE(z, s->sub.trees.blens);
|
||||||
if (t != Z_OK)
|
if (t != Z_OK)
|
||||||
{
|
{
|
||||||
if (t == (uInt)Z_DATA_ERROR)
|
if (t == (uInt)Z_DATA_ERROR)
|
||||||
@ -326,18 +321,13 @@ int r;
|
|||||||
r = t;
|
r = t;
|
||||||
LEAVE
|
LEAVE
|
||||||
}
|
}
|
||||||
Tracev((stderr, "inflate: trees ok, %d * %d bytes used\n",
|
Tracev((stderr, "inflate: trees ok\n"));
|
||||||
inflate_hufts, sizeof(inflate_huft)));
|
|
||||||
if ((c = inflate_codes_new(bl, bd, tl, td, z)) == Z_NULL)
|
if ((c = inflate_codes_new(bl, bd, tl, td, z)) == Z_NULL)
|
||||||
{
|
{
|
||||||
inflate_trees_free(td, z);
|
|
||||||
inflate_trees_free(tl, z);
|
|
||||||
r = Z_MEM_ERROR;
|
r = Z_MEM_ERROR;
|
||||||
LEAVE
|
LEAVE
|
||||||
}
|
}
|
||||||
s->sub.decode.codes = c;
|
s->sub.decode.codes = c;
|
||||||
s->sub.decode.tl = tl;
|
|
||||||
s->sub.decode.td = td;
|
|
||||||
}
|
}
|
||||||
s->mode = CODES;
|
s->mode = CODES;
|
||||||
case CODES:
|
case CODES:
|
||||||
@ -346,8 +336,6 @@ int r;
|
|||||||
return inflate_flush(s, z, r);
|
return inflate_flush(s, z, r);
|
||||||
r = Z_OK;
|
r = Z_OK;
|
||||||
inflate_codes_free(s->sub.decode.codes, z);
|
inflate_codes_free(s->sub.decode.codes, z);
|
||||||
inflate_trees_free(s->sub.decode.td, z);
|
|
||||||
inflate_trees_free(s->sub.decode.tl, z);
|
|
||||||
LOAD
|
LOAD
|
||||||
Tracev((stderr, "inflate: codes end, %lu total out\n",
|
Tracev((stderr, "inflate: codes end, %lu total out\n",
|
||||||
z->total_out + (q >= s->read ? q - s->read :
|
z->total_out + (q >= s->read ? q - s->read :
|
||||||
@ -357,13 +345,6 @@ int r;
|
|||||||
s->mode = TYPE;
|
s->mode = TYPE;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (k > 7) /* return unused byte, if any */
|
|
||||||
{
|
|
||||||
Assert(k < 16, "inflate_codes grabbed too many bytes")
|
|
||||||
k -= 8;
|
|
||||||
n++;
|
|
||||||
p--; /* can always return one */
|
|
||||||
}
|
|
||||||
s->mode = DRY;
|
s->mode = DRY;
|
||||||
case DRY:
|
case DRY:
|
||||||
FLUSH
|
FLUSH
|
||||||
@ -383,15 +364,15 @@ int r;
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int inflate_blocks_free(s, z, c)
|
int inflate_blocks_free(s, z)
|
||||||
inflate_blocks_statef *s;
|
inflate_blocks_statef *s;
|
||||||
z_streamp z;
|
z_streamp z;
|
||||||
uLongf *c;
|
|
||||||
{
|
{
|
||||||
inflate_blocks_reset(s, z, c);
|
inflate_blocks_reset(s, z, Z_NULL);
|
||||||
ZFREE(z, s->window);
|
ZFREE(z, s->window);
|
||||||
|
ZFREE(z, s->hufts);
|
||||||
ZFREE(z, s);
|
ZFREE(z, s);
|
||||||
Trace((stderr, "inflate: blocks freed\n"));
|
Tracev((stderr, "inflate: blocks freed\n"));
|
||||||
return Z_OK;
|
return Z_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -401,6 +382,17 @@ inflate_blocks_statef *s;
|
|||||||
const Bytef *d;
|
const Bytef *d;
|
||||||
uInt n;
|
uInt n;
|
||||||
{
|
{
|
||||||
zmemcpy((charf *)s->window, d, n);
|
zmemcpy(s->window, d, n);
|
||||||
s->read = s->write = s->window + n;
|
s->read = s->write = s->window + n;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Returns true if inflate is currently at the end of a block generated
|
||||||
|
* by Z_SYNC_FLUSH or Z_FULL_FLUSH.
|
||||||
|
* IN assertion: s != Z_NULL
|
||||||
|
*/
|
||||||
|
int inflate_blocks_sync_point(s)
|
||||||
|
inflate_blocks_statef *s;
|
||||||
|
{
|
||||||
|
return s->mode == LENS;
|
||||||
|
}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* infblock.h -- header to use infblock.c
|
/* infblock.h -- header to use infblock.c
|
||||||
* Copyright (C) 1995-1996 Mark Adler
|
* Copyright (C) 1995-1998 Mark Adler
|
||||||
* For conditions of distribution and use, see copyright notice in zlib.h
|
* For conditions of distribution and use, see copyright notice in zlib.h
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@ -28,10 +28,12 @@ extern void inflate_blocks_reset OF((
|
|||||||
|
|
||||||
extern int inflate_blocks_free OF((
|
extern int inflate_blocks_free OF((
|
||||||
inflate_blocks_statef *,
|
inflate_blocks_statef *,
|
||||||
z_streamp ,
|
z_streamp));
|
||||||
uLongf *)); /* check value on output */
|
|
||||||
|
|
||||||
extern void inflate_set_dictionary OF((
|
extern void inflate_set_dictionary OF((
|
||||||
inflate_blocks_statef *s,
|
inflate_blocks_statef *s,
|
||||||
const Bytef *d, /* dictionary */
|
const Bytef *d, /* dictionary */
|
||||||
uInt n)); /* dictionary length */
|
uInt n)); /* dictionary length */
|
||||||
|
|
||||||
|
extern int inflate_blocks_sync_point OF((
|
||||||
|
inflate_blocks_statef *s));
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* infcodes.c -- process literals and length/distance pairs
|
/* infcodes.c -- process literals and length/distance pairs
|
||||||
* Copyright (C) 1995-1996 Mark Adler
|
* Copyright (C) 1995-1998 Mark Adler
|
||||||
* For conditions of distribution and use, see copyright notice in zlib.h
|
* For conditions of distribution and use, see copyright notice in zlib.h
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@ -11,16 +11,10 @@
|
|||||||
#include "inffast.h"
|
#include "inffast.h"
|
||||||
|
|
||||||
/* simplify the use of the inflate_huft type with some defines */
|
/* simplify the use of the inflate_huft type with some defines */
|
||||||
#define base more.Base
|
|
||||||
#define next more.Next
|
|
||||||
#define exop word.what.Exop
|
#define exop word.what.Exop
|
||||||
#define bits word.what.Bits
|
#define bits word.what.Bits
|
||||||
|
|
||||||
/* inflate codes private state */
|
typedef enum { /* waiting for "i:"=input, "o:"=output, "x:"=nothing */
|
||||||
struct inflate_codes_state {
|
|
||||||
|
|
||||||
/* mode */
|
|
||||||
enum { /* waiting for "i:"=input, "o:"=output, "x:"=nothing */
|
|
||||||
START, /* x: set up for LEN */
|
START, /* x: set up for LEN */
|
||||||
LEN, /* i: get length/literal/eob next */
|
LEN, /* i: get length/literal/eob next */
|
||||||
LENEXT, /* i: getting length extra (have base) */
|
LENEXT, /* i: getting length extra (have base) */
|
||||||
@ -31,7 +25,13 @@ struct inflate_codes_state {
|
|||||||
WASH, /* o: got eob, possibly still output waiting */
|
WASH, /* o: got eob, possibly still output waiting */
|
||||||
END, /* x: got eob and all data flushed */
|
END, /* x: got eob and all data flushed */
|
||||||
BADCODE} /* x: got error */
|
BADCODE} /* x: got error */
|
||||||
mode; /* current inflate_codes mode */
|
inflate_codes_mode;
|
||||||
|
|
||||||
|
/* inflate codes private state */
|
||||||
|
struct inflate_codes_state {
|
||||||
|
|
||||||
|
/* mode */
|
||||||
|
inflate_codes_mode mode; /* current inflate_codes mode */
|
||||||
|
|
||||||
/* mode dependent information */
|
/* mode dependent information */
|
||||||
uInt len;
|
uInt len;
|
||||||
@ -143,7 +143,7 @@ int r;
|
|||||||
if ((e & 64) == 0) /* next table */
|
if ((e & 64) == 0) /* next table */
|
||||||
{
|
{
|
||||||
c->sub.code.need = e;
|
c->sub.code.need = e;
|
||||||
c->sub.code.tree = t->next;
|
c->sub.code.tree = t + t->base;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (e & 32) /* end of block */
|
if (e & 32) /* end of block */
|
||||||
@ -181,7 +181,7 @@ int r;
|
|||||||
if ((e & 64) == 0) /* next table */
|
if ((e & 64) == 0) /* next table */
|
||||||
{
|
{
|
||||||
c->sub.code.need = e;
|
c->sub.code.need = e;
|
||||||
c->sub.code.tree = t->next;
|
c->sub.code.tree = t + t->base;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
c->mode = BADCODE; /* invalid code */
|
c->mode = BADCODE; /* invalid code */
|
||||||
@ -221,6 +221,13 @@ int r;
|
|||||||
c->mode = START;
|
c->mode = START;
|
||||||
break;
|
break;
|
||||||
case WASH: /* o: got eob, possibly more output */
|
case WASH: /* o: got eob, possibly more output */
|
||||||
|
if (k > 7) /* return unused byte, if any */
|
||||||
|
{
|
||||||
|
Assert(k < 16, "inflate_codes grabbed too many bytes")
|
||||||
|
k -= 8;
|
||||||
|
n++;
|
||||||
|
p--; /* can always return one */
|
||||||
|
}
|
||||||
FLUSH
|
FLUSH
|
||||||
if (s->read != s->write)
|
if (s->read != s->write)
|
||||||
LEAVE
|
LEAVE
|
||||||
@ -235,6 +242,9 @@ int r;
|
|||||||
r = Z_STREAM_ERROR;
|
r = Z_STREAM_ERROR;
|
||||||
LEAVE
|
LEAVE
|
||||||
}
|
}
|
||||||
|
#ifdef NEED_DUMMY_RETURN
|
||||||
|
return Z_STREAM_ERROR; /* Some dumb compilers complain without this */
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* infcodes.h -- header to use infcodes.c
|
/* infcodes.h -- header to use infcodes.c
|
||||||
* Copyright (C) 1995-1996 Mark Adler
|
* Copyright (C) 1995-1998 Mark Adler
|
||||||
* For conditions of distribution and use, see copyright notice in zlib.h
|
* For conditions of distribution and use, see copyright notice in zlib.h
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* inffast.c -- process literals and length/distance pairs fast
|
/* inffast.c -- process literals and length/distance pairs fast
|
||||||
* Copyright (C) 1995-1996 Mark Adler
|
* Copyright (C) 1995-1998 Mark Adler
|
||||||
* For conditions of distribution and use, see copyright notice in zlib.h
|
* For conditions of distribution and use, see copyright notice in zlib.h
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@ -13,14 +13,12 @@
|
|||||||
struct inflate_codes_state {int dummy;}; /* for buggy compilers */
|
struct inflate_codes_state {int dummy;}; /* for buggy compilers */
|
||||||
|
|
||||||
/* simplify the use of the inflate_huft type with some defines */
|
/* simplify the use of the inflate_huft type with some defines */
|
||||||
#define base more.Base
|
|
||||||
#define next more.Next
|
|
||||||
#define exop word.what.Exop
|
#define exop word.what.Exop
|
||||||
#define bits word.what.Bits
|
#define bits word.what.Bits
|
||||||
|
|
||||||
/* macros for bit input with no checking and for returning unused bytes */
|
/* macros for bit input with no checking and for returning unused bytes */
|
||||||
#define GRABBITS(j) {while(k<(j)){b|=((uLong)NEXTBYTE)<<k;k+=8;}}
|
#define GRABBITS(j) {while(k<(j)){b|=((uLong)NEXTBYTE)<<k;k+=8;}}
|
||||||
#define UNGRAB {n+=(c=k>>3);p-=c;k&=7;}
|
#define UNGRAB {c=z->avail_in-n;c=(k>>3)<c?k>>3:c;n+=c;p-=c;k-=c<<3;}
|
||||||
|
|
||||||
/* Called with number of bytes left to write in window at least 258
|
/* Called with number of bytes left to write in window at least 258
|
||||||
(the maximum string length) and number of input bytes available
|
(the maximum string length) and number of input bytes available
|
||||||
@ -120,7 +118,10 @@ z_streamp z;
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
else if ((e & 64) == 0)
|
else if ((e & 64) == 0)
|
||||||
e = (t = t->next + ((uInt)b & inflate_mask[e]))->exop;
|
{
|
||||||
|
t += t->base;
|
||||||
|
e = (t += ((uInt)b & inflate_mask[e]))->exop;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
z->msg = (char*)"invalid distance code";
|
z->msg = (char*)"invalid distance code";
|
||||||
@ -133,7 +134,8 @@ z_streamp z;
|
|||||||
}
|
}
|
||||||
if ((e & 64) == 0)
|
if ((e & 64) == 0)
|
||||||
{
|
{
|
||||||
if ((e = (t = t->next + ((uInt)b & inflate_mask[e]))->exop) == 0)
|
t += t->base;
|
||||||
|
if ((e = (t += ((uInt)b & inflate_mask[e]))->exop) == 0)
|
||||||
{
|
{
|
||||||
DUMPBITS(t->bits)
|
DUMPBITS(t->bits)
|
||||||
Tracevv((stderr, t->base >= 0x20 && t->base < 0x7f ?
|
Tracevv((stderr, t->base >= 0x20 && t->base < 0x7f ?
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* inffast.h -- header to use inffast.c
|
/* inffast.h -- header to use inffast.c
|
||||||
* Copyright (C) 1995-1996 Mark Adler
|
* Copyright (C) 1995-1998 Mark Adler
|
||||||
* For conditions of distribution and use, see copyright notice in zlib.h
|
* For conditions of distribution and use, see copyright notice in zlib.h
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
@ -1,19 +1,14 @@
|
|||||||
/* inflate.c -- zlib interface to inflate modules
|
/* inflate.c -- zlib interface to inflate modules
|
||||||
* Copyright (C) 1995-1996 Mark Adler
|
* Copyright (C) 1995-1998 Mark Adler
|
||||||
* For conditions of distribution and use, see copyright notice in zlib.h
|
* For conditions of distribution and use, see copyright notice in zlib.h
|
||||||
*/
|
*/
|
||||||
/* This file was modified since it was taken from the zlib distribution */
|
|
||||||
|
|
||||||
#include "zutil.h"
|
#include "zutil.h"
|
||||||
#include "infblock.h"
|
#include "infblock.h"
|
||||||
|
|
||||||
struct inflate_blocks_state {int dummy;}; /* for buggy compilers */
|
struct inflate_blocks_state {int dummy;}; /* for buggy compilers */
|
||||||
|
|
||||||
/* inflate private state */
|
typedef enum {
|
||||||
struct internal_state {
|
|
||||||
|
|
||||||
/* mode */
|
|
||||||
enum {
|
|
||||||
METHOD, /* waiting for method byte */
|
METHOD, /* waiting for method byte */
|
||||||
FLAG, /* waiting for flag byte */
|
FLAG, /* waiting for flag byte */
|
||||||
DICT4, /* four dictionary check bytes to go */
|
DICT4, /* four dictionary check bytes to go */
|
||||||
@ -28,7 +23,13 @@ struct internal_state {
|
|||||||
CHECK1, /* one check byte to go */
|
CHECK1, /* one check byte to go */
|
||||||
DONE, /* finished check, done */
|
DONE, /* finished check, done */
|
||||||
BAD} /* got an error--stay here */
|
BAD} /* got an error--stay here */
|
||||||
mode; /* current inflate mode */
|
inflate_mode;
|
||||||
|
|
||||||
|
/* inflate private state */
|
||||||
|
struct internal_state {
|
||||||
|
|
||||||
|
/* mode */
|
||||||
|
inflate_mode mode; /* current inflate mode */
|
||||||
|
|
||||||
/* mode dependent information */
|
/* mode dependent information */
|
||||||
union {
|
union {
|
||||||
@ -49,39 +50,35 @@ struct internal_state {
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
PR_PUBLIC_API(int) inflateReset(z)
|
int ZEXPORT inflateReset(z)
|
||||||
z_streamp z;
|
z_streamp z;
|
||||||
{
|
{
|
||||||
uLong c;
|
|
||||||
|
|
||||||
if (z == Z_NULL || z->state == Z_NULL)
|
if (z == Z_NULL || z->state == Z_NULL)
|
||||||
return Z_STREAM_ERROR;
|
return Z_STREAM_ERROR;
|
||||||
z->total_in = z->total_out = 0;
|
z->total_in = z->total_out = 0;
|
||||||
z->msg = Z_NULL;
|
z->msg = Z_NULL;
|
||||||
z->state->mode = z->state->nowrap ? BLOCKS : METHOD;
|
z->state->mode = z->state->nowrap ? BLOCKS : METHOD;
|
||||||
inflate_blocks_reset(z->state->blocks, z, &c);
|
inflate_blocks_reset(z->state->blocks, z, Z_NULL);
|
||||||
Trace((stderr, "inflate: reset\n"));
|
Tracev((stderr, "inflate: reset\n"));
|
||||||
return Z_OK;
|
return Z_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
PR_PUBLIC_API(int) inflateEnd(z)
|
int ZEXPORT inflateEnd(z)
|
||||||
z_streamp z;
|
z_streamp z;
|
||||||
{
|
{
|
||||||
uLong c;
|
|
||||||
|
|
||||||
if (z == Z_NULL || z->state == Z_NULL || z->zfree == Z_NULL)
|
if (z == Z_NULL || z->state == Z_NULL || z->zfree == Z_NULL)
|
||||||
return Z_STREAM_ERROR;
|
return Z_STREAM_ERROR;
|
||||||
if (z->state->blocks != Z_NULL)
|
if (z->state->blocks != Z_NULL)
|
||||||
inflate_blocks_free(z->state->blocks, z, &c);
|
inflate_blocks_free(z->state->blocks, z);
|
||||||
ZFREE(z, z->state);
|
ZFREE(z, z->state);
|
||||||
z->state = Z_NULL;
|
z->state = Z_NULL;
|
||||||
Trace((stderr, "inflate: end\n"));
|
Tracev((stderr, "inflate: end\n"));
|
||||||
return Z_OK;
|
return Z_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
PR_PUBLIC_API(int) inflateInit2_(z, w, version, stream_size)
|
int ZEXPORT inflateInit2_(z, w, version, stream_size)
|
||||||
z_streamp z;
|
z_streamp z;
|
||||||
int w;
|
int w;
|
||||||
const char *version;
|
const char *version;
|
||||||
@ -130,7 +127,7 @@ int stream_size;
|
|||||||
inflateEnd(z);
|
inflateEnd(z);
|
||||||
return Z_MEM_ERROR;
|
return Z_MEM_ERROR;
|
||||||
}
|
}
|
||||||
Trace((stderr, "inflate: allocated\n"));
|
Tracev((stderr, "inflate: allocated\n"));
|
||||||
|
|
||||||
/* reset state */
|
/* reset state */
|
||||||
inflateReset(z);
|
inflateReset(z);
|
||||||
@ -138,7 +135,7 @@ int stream_size;
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
PR_PUBLIC_API(int) inflateInit_(z, version, stream_size)
|
int ZEXPORT inflateInit_(z, version, stream_size)
|
||||||
z_streamp z;
|
z_streamp z;
|
||||||
const char *version;
|
const char *version;
|
||||||
int stream_size;
|
int stream_size;
|
||||||
@ -147,18 +144,19 @@ int stream_size;
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#define NEEDBYTE {if(z->avail_in==0)return r;r=Z_OK;}
|
#define NEEDBYTE {if(z->avail_in==0)return r;r=f;}
|
||||||
#define NEXTBYTE (z->avail_in--,z->total_in++,*z->next_in++)
|
#define NEXTBYTE (z->avail_in--,z->total_in++,*z->next_in++)
|
||||||
|
|
||||||
PR_PUBLIC_API(int) inflate(z, f)
|
int ZEXPORT inflate(z, f)
|
||||||
z_streamp z;
|
z_streamp z;
|
||||||
int f;
|
int f;
|
||||||
{
|
{
|
||||||
int r;
|
int r;
|
||||||
uInt b;
|
uInt b;
|
||||||
|
|
||||||
if (z == Z_NULL || z->state == Z_NULL || z->next_in == Z_NULL || f < 0)
|
if (z == Z_NULL || z->state == Z_NULL || z->next_in == Z_NULL)
|
||||||
return Z_STREAM_ERROR;
|
return Z_STREAM_ERROR;
|
||||||
|
f = f == Z_FINISH ? Z_BUF_ERROR : Z_OK;
|
||||||
r = Z_BUF_ERROR;
|
r = Z_BUF_ERROR;
|
||||||
while (1) switch (z->state->mode)
|
while (1) switch (z->state->mode)
|
||||||
{
|
{
|
||||||
@ -189,11 +187,11 @@ int f;
|
|||||||
z->state->sub.marker = 5; /* can't try inflateSync */
|
z->state->sub.marker = 5; /* can't try inflateSync */
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
Trace((stderr, "inflate: zlib header ok\n"));
|
Tracev((stderr, "inflate: zlib header ok\n"));
|
||||||
if (!(b & PRESET_DICT))
|
if (!(b & PRESET_DICT))
|
||||||
{
|
{
|
||||||
z->state->mode = BLOCKS;
|
z->state->mode = BLOCKS;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
z->state->mode = DICT4;
|
z->state->mode = DICT4;
|
||||||
case DICT4:
|
case DICT4:
|
||||||
@ -227,9 +225,11 @@ int f;
|
|||||||
z->state->sub.marker = 0; /* can try inflateSync */
|
z->state->sub.marker = 0; /* can try inflateSync */
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
if (r == Z_OK)
|
||||||
|
r = f;
|
||||||
if (r != Z_STREAM_END)
|
if (r != Z_STREAM_END)
|
||||||
return r;
|
return r;
|
||||||
r = Z_OK;
|
r = f;
|
||||||
inflate_blocks_reset(z->state->blocks, z, &z->state->sub.check.was);
|
inflate_blocks_reset(z->state->blocks, z, &z->state->sub.check.was);
|
||||||
if (z->state->nowrap)
|
if (z->state->nowrap)
|
||||||
{
|
{
|
||||||
@ -260,7 +260,7 @@ int f;
|
|||||||
z->state->sub.marker = 5; /* can't try inflateSync */
|
z->state->sub.marker = 5; /* can't try inflateSync */
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
Trace((stderr, "inflate: zlib check ok\n"));
|
Tracev((stderr, "inflate: zlib check ok\n"));
|
||||||
z->state->mode = DONE;
|
z->state->mode = DONE;
|
||||||
case DONE:
|
case DONE:
|
||||||
return Z_STREAM_END;
|
return Z_STREAM_END;
|
||||||
@ -269,10 +269,13 @@ int f;
|
|||||||
default:
|
default:
|
||||||
return Z_STREAM_ERROR;
|
return Z_STREAM_ERROR;
|
||||||
}
|
}
|
||||||
|
#ifdef NEED_DUMMY_RETURN
|
||||||
|
return Z_STREAM_ERROR; /* Some dumb compilers complain without this */
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
PR_PUBLIC_API(int) inflateSetDictionary(z, dictionary, dictLength)
|
int ZEXPORT inflateSetDictionary(z, dictionary, dictLength)
|
||||||
z_streamp z;
|
z_streamp z;
|
||||||
const Bytef *dictionary;
|
const Bytef *dictionary;
|
||||||
uInt dictLength;
|
uInt dictLength;
|
||||||
@ -296,7 +299,7 @@ uInt dictLength;
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
PR_PUBLIC_API(int) inflateSync(z)
|
int ZEXPORT inflateSync(z)
|
||||||
z_streamp z;
|
z_streamp z;
|
||||||
{
|
{
|
||||||
uInt n; /* number of bytes to look at */
|
uInt n; /* number of bytes to look at */
|
||||||
@ -320,7 +323,8 @@ z_streamp z;
|
|||||||
/* search */
|
/* search */
|
||||||
while (n && m < 4)
|
while (n && m < 4)
|
||||||
{
|
{
|
||||||
if (*p == (Byte)(m < 2 ? 0 : 0xff))
|
static const Byte mark[4] = {0, 0, 0xff, 0xff};
|
||||||
|
if (*p == mark[m])
|
||||||
m++;
|
m++;
|
||||||
else if (*p)
|
else if (*p)
|
||||||
m = 0;
|
m = 0;
|
||||||
@ -344,3 +348,19 @@ z_streamp z;
|
|||||||
z->state->mode = BLOCKS;
|
z->state->mode = BLOCKS;
|
||||||
return Z_OK;
|
return Z_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Returns true if inflate is currently at the end of a block generated
|
||||||
|
* by Z_SYNC_FLUSH or Z_FULL_FLUSH. This function is used by one PPP
|
||||||
|
* implementation to provide an additional safety check. PPP uses Z_SYNC_FLUSH
|
||||||
|
* but removes the length bytes of the resulting empty stored block. When
|
||||||
|
* decompressing, PPP checks that at the end of input packet, inflate is
|
||||||
|
* waiting for these length bytes.
|
||||||
|
*/
|
||||||
|
int ZEXPORT inflateSyncPoint(z)
|
||||||
|
z_streamp z;
|
||||||
|
{
|
||||||
|
if (z == Z_NULL || z->state == Z_NULL || z->state->blocks == Z_NULL)
|
||||||
|
return Z_STREAM_ERROR;
|
||||||
|
return inflate_blocks_sync_point(z->state->blocks);
|
||||||
|
}
|
||||||
|
@ -1,13 +1,17 @@
|
|||||||
/* inftrees.c -- generate Huffman trees for efficient decoding
|
/* inftrees.c -- generate Huffman trees for efficient decoding
|
||||||
* Copyright (C) 1995-1996 Mark Adler
|
* Copyright (C) 1995-1998 Mark Adler
|
||||||
* For conditions of distribution and use, see copyright notice in zlib.h
|
* For conditions of distribution and use, see copyright notice in zlib.h
|
||||||
*/
|
*/
|
||||||
/* This file was modified since it was taken from the zlib distribution */
|
|
||||||
|
|
||||||
#include "zutil.h"
|
#include "zutil.h"
|
||||||
#include "inftrees.h"
|
#include "inftrees.h"
|
||||||
|
|
||||||
char inflate_copyright[] = " inflate 1.0.4 Copyright 1995-1996 Mark Adler ";
|
#if !defined(BUILDFIXED) && !defined(STDC)
|
||||||
|
# define BUILDFIXED /* non ANSI compilers may not accept inffixed.h */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
const char inflate_copyright[] =
|
||||||
|
" inflate 1.1.3 Copyright 1995-1998 Mark Adler ";
|
||||||
/*
|
/*
|
||||||
If you use the zlib library in a product, an acknowledgment is welcome
|
If you use the zlib library in a product, an acknowledgment is welcome
|
||||||
in the documentation of your product. If for some reason you cannot
|
in the documentation of your product. If for some reason you cannot
|
||||||
@ -17,8 +21,6 @@ char inflate_copyright[] = " inflate 1.0.4 Copyright 1995-1996 Mark Adler ";
|
|||||||
struct internal_state {int dummy;}; /* for buggy compilers */
|
struct internal_state {int dummy;}; /* for buggy compilers */
|
||||||
|
|
||||||
/* simplify the use of the inflate_huft type with some defines */
|
/* simplify the use of the inflate_huft type with some defines */
|
||||||
#define base more.Base
|
|
||||||
#define next more.Next
|
|
||||||
#define exop word.what.Exop
|
#define exop word.what.Exop
|
||||||
#define bits word.what.Bits
|
#define bits word.what.Bits
|
||||||
|
|
||||||
@ -27,30 +29,27 @@ local int huft_build OF((
|
|||||||
uIntf *, /* code lengths in bits */
|
uIntf *, /* code lengths in bits */
|
||||||
uInt, /* number of codes */
|
uInt, /* number of codes */
|
||||||
uInt, /* number of "simple" codes */
|
uInt, /* number of "simple" codes */
|
||||||
uIntf *, /* list of base values for non-simple codes */
|
const uIntf *, /* list of base values for non-simple codes */
|
||||||
uIntf *, /* list of extra bits for non-simple codes */
|
const uIntf *, /* list of extra bits for non-simple codes */
|
||||||
inflate_huft * FAR*,/* result: starting table */
|
inflate_huft * FAR*,/* result: starting table */
|
||||||
uIntf *, /* maximum lookup bits (returns actual) */
|
uIntf *, /* maximum lookup bits (returns actual) */
|
||||||
z_streamp )); /* for zalloc function */
|
inflate_huft *, /* space for trees */
|
||||||
|
uInt *, /* hufts used in space */
|
||||||
local voidpf falloc OF((
|
uIntf * )); /* space for values */
|
||||||
voidpf, /* opaque pointer (not used) */
|
|
||||||
uInt, /* number of items */
|
|
||||||
uInt)); /* size of item */
|
|
||||||
|
|
||||||
/* Tables for deflate from PKZIP's appnote.txt. */
|
/* Tables for deflate from PKZIP's appnote.txt. */
|
||||||
local uInt cplens[31] = { /* Copy lengths for literal codes 257..285 */
|
local const uInt cplens[31] = { /* Copy lengths for literal codes 257..285 */
|
||||||
3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31,
|
3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31,
|
||||||
35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0};
|
35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0};
|
||||||
/* see note #13 above about 258 */
|
/* see note #13 above about 258 */
|
||||||
local uInt cplext[31] = { /* Extra bits for literal codes 257..285 */
|
local const uInt cplext[31] = { /* Extra bits for literal codes 257..285 */
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2,
|
0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2,
|
||||||
3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, 112, 112}; /* 112==invalid */
|
3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, 112, 112}; /* 112==invalid */
|
||||||
local uInt cpdist[30] = { /* Copy offsets for distance codes 0..29 */
|
local const uInt cpdist[30] = { /* Copy offsets for distance codes 0..29 */
|
||||||
1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193,
|
1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193,
|
||||||
257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145,
|
257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145,
|
||||||
8193, 12289, 16385, 24577};
|
8193, 12289, 16385, 24577};
|
||||||
local uInt cpdext[30] = { /* Extra bits for distance codes */
|
local const uInt cpdext[30] = { /* Extra bits for distance codes */
|
||||||
0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6,
|
0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6,
|
||||||
7, 7, 8, 8, 9, 9, 10, 10, 11, 11,
|
7, 7, 8, 8, 9, 9, 10, 10, 11, 11,
|
||||||
12, 12, 13, 13};
|
12, 12, 13, 13};
|
||||||
@ -90,26 +89,23 @@ local uInt cpdext[30] = { /* Extra bits for distance codes */
|
|||||||
|
|
||||||
/* If BMAX needs to be larger than 16, then h and x[] should be uLong. */
|
/* If BMAX needs to be larger than 16, then h and x[] should be uLong. */
|
||||||
#define BMAX 15 /* maximum bit length of any code */
|
#define BMAX 15 /* maximum bit length of any code */
|
||||||
#define N_MAX 288 /* maximum number of codes in any set */
|
|
||||||
|
|
||||||
#ifdef DEBUG
|
local int huft_build(b, n, s, d, e, t, m, hp, hn, v)
|
||||||
uInt inflate_hufts;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
local int huft_build(b, n, s, d, e, t, m, zs)
|
|
||||||
uIntf *b; /* code lengths in bits (all assumed <= BMAX) */
|
uIntf *b; /* code lengths in bits (all assumed <= BMAX) */
|
||||||
uInt n; /* number of codes (assumed <= N_MAX) */
|
uInt n; /* number of codes (assumed <= 288) */
|
||||||
uInt s; /* number of simple-valued codes (0..s-1) */
|
uInt s; /* number of simple-valued codes (0..s-1) */
|
||||||
uIntf *d; /* list of base values for non-simple codes */
|
const uIntf *d; /* list of base values for non-simple codes */
|
||||||
uIntf *e; /* list of extra bits for non-simple codes */
|
const uIntf *e; /* list of extra bits for non-simple codes */
|
||||||
inflate_huft * FAR *t; /* result: starting table */
|
inflate_huft * FAR *t; /* result: starting table */
|
||||||
uIntf *m; /* maximum lookup bits, returns actual */
|
uIntf *m; /* maximum lookup bits, returns actual */
|
||||||
z_streamp zs; /* for zalloc function */
|
inflate_huft *hp; /* space for trees */
|
||||||
|
uInt *hn; /* hufts used in space */
|
||||||
|
uIntf *v; /* working area: values in order of bit length */
|
||||||
/* Given a list of code lengths and a maximum table size, make a set of
|
/* Given a list of code lengths and a maximum table size, make a set of
|
||||||
tables to decode that set of codes. Return Z_OK on success, Z_BUF_ERROR
|
tables to decode that set of codes. Return Z_OK on success, Z_BUF_ERROR
|
||||||
if the given code set is incomplete (the tables are still built in this
|
if the given code set is incomplete (the tables are still built in this
|
||||||
case), Z_DATA_ERROR if the input is invalid (an over-subscribed set of
|
case), Z_DATA_ERROR if the input is invalid (an over-subscribed set of
|
||||||
set of lengths), or Z_MEM_ERROR if not enough memory. */
|
lengths), or Z_MEM_ERROR if not enough memory. */
|
||||||
{
|
{
|
||||||
|
|
||||||
uInt a; /* counter for codes of length k */
|
uInt a; /* counter for codes of length k */
|
||||||
@ -121,11 +117,11 @@ z_streamp zs; /* for zalloc function */
|
|||||||
register uInt j; /* counter */
|
register uInt j; /* counter */
|
||||||
register int k; /* number of bits in current code */
|
register int k; /* number of bits in current code */
|
||||||
int l; /* bits per table (returned in m) */
|
int l; /* bits per table (returned in m) */
|
||||||
|
uInt mask; /* (1 << w) - 1, to avoid cc -O bug on HP */
|
||||||
register uIntf *p; /* pointer into c[], b[], or v[] */
|
register uIntf *p; /* pointer into c[], b[], or v[] */
|
||||||
inflate_huft *q; /* points to current table */
|
inflate_huft *q; /* points to current table */
|
||||||
struct inflate_huft_s r; /* table entry for structure assignment */
|
struct inflate_huft_s r; /* table entry for structure assignment */
|
||||||
inflate_huft *u[BMAX]; /* table stack */
|
inflate_huft *u[BMAX]; /* table stack */
|
||||||
uInt v[N_MAX]; /* values in order of bit length */
|
|
||||||
register int w; /* bits before this table == (l * h) */
|
register int w; /* bits before this table == (l * h) */
|
||||||
uInt x[BMAX+1]; /* bit offsets, then code stack */
|
uInt x[BMAX+1]; /* bit offsets, then code stack */
|
||||||
uIntf *xp; /* pointer into x */
|
uIntf *xp; /* pointer into x */
|
||||||
@ -191,7 +187,7 @@ z_streamp zs; /* for zalloc function */
|
|||||||
if ((j = *p++) != 0)
|
if ((j = *p++) != 0)
|
||||||
v[x[j]++] = i;
|
v[x[j]++] = i;
|
||||||
} while (++i < n);
|
} while (++i < n);
|
||||||
n = x[g]; /* set n to length of v */
|
n = x[g]; /* set n to length of v */
|
||||||
|
|
||||||
|
|
||||||
/* Generate the Huffman codes and for each, make the table entries */
|
/* Generate the Huffman codes and for each, make the table entries */
|
||||||
@ -233,20 +229,11 @@ z_streamp zs; /* for zalloc function */
|
|||||||
}
|
}
|
||||||
z = 1 << j; /* table entries for j-bit table */
|
z = 1 << j; /* table entries for j-bit table */
|
||||||
|
|
||||||
/* allocate and link in new table */
|
/* allocate new table */
|
||||||
if ((q = (inflate_huft *)ZALLOC
|
if (*hn + z > MANY) /* (note: doesn't matter for fixed) */
|
||||||
(zs,z + 1,sizeof(inflate_huft))) == Z_NULL)
|
|
||||||
{
|
|
||||||
if (h)
|
|
||||||
inflate_trees_free(u[0], zs);
|
|
||||||
return Z_MEM_ERROR; /* not enough memory */
|
return Z_MEM_ERROR; /* not enough memory */
|
||||||
}
|
u[h] = q = hp + *hn;
|
||||||
#ifdef DEBUG
|
*hn += z;
|
||||||
inflate_hufts += z + 1;
|
|
||||||
#endif
|
|
||||||
*t = q + 1; /* link to list for huft_free() */
|
|
||||||
*(t = &(q->next)) = Z_NULL;
|
|
||||||
u[h] = ++q; /* table starts after link */
|
|
||||||
|
|
||||||
/* connect to last table, if there is one */
|
/* connect to last table, if there is one */
|
||||||
if (h)
|
if (h)
|
||||||
@ -254,10 +241,12 @@ z_streamp zs; /* for zalloc function */
|
|||||||
x[h] = i; /* save pattern for backing up */
|
x[h] = i; /* save pattern for backing up */
|
||||||
r.bits = (Byte)l; /* bits to dump before this table */
|
r.bits = (Byte)l; /* bits to dump before this table */
|
||||||
r.exop = (Byte)j; /* bits in this table */
|
r.exop = (Byte)j; /* bits in this table */
|
||||||
r.next = q; /* pointer to this table */
|
j = i >> (w - l);
|
||||||
j = i >> (w - l); /* (get around Turbo C bug) */
|
r.base = (uInt)(q - u[h-1] - j); /* offset to this table */
|
||||||
u[h-1][j] = r; /* connect to last table */
|
u[h-1][j] = r; /* connect to last table */
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
*t = q; /* first table is returned result */
|
||||||
}
|
}
|
||||||
|
|
||||||
/* set up table entry in r */
|
/* set up table entry in r */
|
||||||
@ -286,10 +275,12 @@ z_streamp zs; /* for zalloc function */
|
|||||||
i ^= j;
|
i ^= j;
|
||||||
|
|
||||||
/* backup over finished tables */
|
/* backup over finished tables */
|
||||||
while ((i & ((1 << w) - 1)) != x[h])
|
mask = (1 << w) - 1; /* needed on HP, cc -O bug */
|
||||||
|
while ((i & mask) != x[h])
|
||||||
{
|
{
|
||||||
h--; /* don't need to update q */
|
h--; /* don't need to update q */
|
||||||
w -= l;
|
w -= l;
|
||||||
|
mask = (1 << w) - 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -300,28 +291,34 @@ z_streamp zs; /* for zalloc function */
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int inflate_trees_bits(c, bb, tb, z)
|
int inflate_trees_bits(c, bb, tb, hp, z)
|
||||||
uIntf *c; /* 19 code lengths */
|
uIntf *c; /* 19 code lengths */
|
||||||
uIntf *bb; /* bits tree desired/actual depth */
|
uIntf *bb; /* bits tree desired/actual depth */
|
||||||
inflate_huft * FAR *tb; /* bits tree result */
|
inflate_huft * FAR *tb; /* bits tree result */
|
||||||
z_streamp z; /* for zfree function */
|
inflate_huft *hp; /* space for trees */
|
||||||
|
z_streamp z; /* for messages */
|
||||||
{
|
{
|
||||||
int r;
|
int r;
|
||||||
|
uInt hn = 0; /* hufts used in space */
|
||||||
|
uIntf *v; /* work area for huft_build */
|
||||||
|
|
||||||
r = huft_build(c, 19, 19, (uIntf*)Z_NULL, (uIntf*)Z_NULL, tb, bb, z);
|
if ((v = (uIntf*)ZALLOC(z, 19, sizeof(uInt))) == Z_NULL)
|
||||||
|
return Z_MEM_ERROR;
|
||||||
|
r = huft_build(c, 19, 19, (uIntf*)Z_NULL, (uIntf*)Z_NULL,
|
||||||
|
tb, bb, hp, &hn, v);
|
||||||
if (r == Z_DATA_ERROR)
|
if (r == Z_DATA_ERROR)
|
||||||
z->msg = (char*)"oversubscribed dynamic bit lengths tree";
|
z->msg = (char*)"oversubscribed dynamic bit lengths tree";
|
||||||
else if (r == Z_BUF_ERROR || *bb == 0)
|
else if (r == Z_BUF_ERROR || *bb == 0)
|
||||||
{
|
{
|
||||||
inflate_trees_free(*tb, z);
|
|
||||||
z->msg = (char*)"incomplete dynamic bit lengths tree";
|
z->msg = (char*)"incomplete dynamic bit lengths tree";
|
||||||
r = Z_DATA_ERROR;
|
r = Z_DATA_ERROR;
|
||||||
}
|
}
|
||||||
|
ZFREE(z, v);
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int inflate_trees_dynamic(nl, nd, c, bl, bd, tl, td, z)
|
int inflate_trees_dynamic(nl, nd, c, bl, bd, tl, td, hp, z)
|
||||||
uInt nl; /* number of literal/length codes */
|
uInt nl; /* number of literal/length codes */
|
||||||
uInt nd; /* number of distance codes */
|
uInt nd; /* number of distance codes */
|
||||||
uIntf *c; /* that many (total) code lengths */
|
uIntf *c; /* that many (total) code lengths */
|
||||||
@ -329,95 +326,100 @@ uIntf *bl; /* literal desired/actual bit depth */
|
|||||||
uIntf *bd; /* distance desired/actual bit depth */
|
uIntf *bd; /* distance desired/actual bit depth */
|
||||||
inflate_huft * FAR *tl; /* literal/length tree result */
|
inflate_huft * FAR *tl; /* literal/length tree result */
|
||||||
inflate_huft * FAR *td; /* distance tree result */
|
inflate_huft * FAR *td; /* distance tree result */
|
||||||
z_streamp z; /* for zfree function */
|
inflate_huft *hp; /* space for trees */
|
||||||
|
z_streamp z; /* for messages */
|
||||||
{
|
{
|
||||||
int r;
|
int r;
|
||||||
|
uInt hn = 0; /* hufts used in space */
|
||||||
|
uIntf *v; /* work area for huft_build */
|
||||||
|
|
||||||
|
/* allocate work area */
|
||||||
|
if ((v = (uIntf*)ZALLOC(z, 288, sizeof(uInt))) == Z_NULL)
|
||||||
|
return Z_MEM_ERROR;
|
||||||
|
|
||||||
/* build literal/length tree */
|
/* build literal/length tree */
|
||||||
r = huft_build(c, nl, 257, cplens, cplext, tl, bl, z);
|
r = huft_build(c, nl, 257, cplens, cplext, tl, bl, hp, &hn, v);
|
||||||
if (r != Z_OK || *bl == 0)
|
if (r != Z_OK || *bl == 0)
|
||||||
{
|
{
|
||||||
if (r == Z_DATA_ERROR)
|
if (r == Z_DATA_ERROR)
|
||||||
z->msg = (char*)"oversubscribed literal/length tree";
|
z->msg = (char*)"oversubscribed literal/length tree";
|
||||||
else if (r != Z_MEM_ERROR)
|
else if (r != Z_MEM_ERROR)
|
||||||
{
|
{
|
||||||
inflate_trees_free(*tl, z);
|
|
||||||
z->msg = (char*)"incomplete literal/length tree";
|
z->msg = (char*)"incomplete literal/length tree";
|
||||||
r = Z_DATA_ERROR;
|
r = Z_DATA_ERROR;
|
||||||
}
|
}
|
||||||
|
ZFREE(z, v);
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* build distance tree */
|
/* build distance tree */
|
||||||
r = huft_build(c + nl, nd, 0, cpdist, cpdext, td, bd, z);
|
r = huft_build(c + nl, nd, 0, cpdist, cpdext, td, bd, hp, &hn, v);
|
||||||
if (r != Z_OK || (*bd == 0 && nl > 257))
|
if (r != Z_OK || (*bd == 0 && nl > 257))
|
||||||
{
|
{
|
||||||
if (r == Z_DATA_ERROR)
|
if (r == Z_DATA_ERROR)
|
||||||
z->msg = (char*)"oversubscribed literal/length tree";
|
z->msg = (char*)"oversubscribed distance tree";
|
||||||
else if (r == Z_BUF_ERROR) {
|
else if (r == Z_BUF_ERROR) {
|
||||||
#ifdef PKZIP_BUG_WORKAROUND
|
#ifdef PKZIP_BUG_WORKAROUND
|
||||||
r = Z_OK;
|
r = Z_OK;
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
inflate_trees_free(*td, z);
|
|
||||||
z->msg = (char*)"incomplete distance tree";
|
z->msg = (char*)"incomplete distance tree";
|
||||||
r = Z_DATA_ERROR;
|
r = Z_DATA_ERROR;
|
||||||
}
|
}
|
||||||
else if (r != Z_MEM_ERROR)
|
else if (r != Z_MEM_ERROR)
|
||||||
{
|
{
|
||||||
z->msg = (char*)"empty distance tree with lengths";
|
z->msg = (char*)"empty distance tree with lengths";
|
||||||
r = Z_DATA_ERROR;
|
r = Z_DATA_ERROR;
|
||||||
}
|
}
|
||||||
inflate_trees_free(*tl, z);
|
ZFREE(z, v);
|
||||||
return r;
|
return r;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/* done */
|
/* done */
|
||||||
|
ZFREE(z, v);
|
||||||
return Z_OK;
|
return Z_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* build fixed tables only once--keep them here */
|
/* build fixed tables only once--keep them here */
|
||||||
|
#ifdef BUILDFIXED
|
||||||
local int fixed_built = 0;
|
local int fixed_built = 0;
|
||||||
#define FIXEDH 530 /* number of hufts used by fixed tables */
|
#define FIXEDH 544 /* number of hufts used by fixed tables */
|
||||||
local inflate_huft fixed_mem[FIXEDH];
|
local inflate_huft fixed_mem[FIXEDH];
|
||||||
local uInt fixed_bl;
|
local uInt fixed_bl;
|
||||||
local uInt fixed_bd;
|
local uInt fixed_bd;
|
||||||
local inflate_huft *fixed_tl;
|
local inflate_huft *fixed_tl;
|
||||||
local inflate_huft *fixed_td;
|
local inflate_huft *fixed_td;
|
||||||
|
#else
|
||||||
|
#include "inffixed.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
local voidpf falloc(q, n, s)
|
int inflate_trees_fixed(bl, bd, tl, td, z)
|
||||||
voidpf q; /* opaque pointer */
|
|
||||||
uInt n; /* number of items */
|
|
||||||
uInt s; /* size of item */
|
|
||||||
{
|
|
||||||
Assert(s == sizeof(inflate_huft) && n <= *(intf *)q,
|
|
||||||
"inflate_trees falloc overflow");
|
|
||||||
*(intf *)q -= n+s-s; /* s-s to avoid warning */
|
|
||||||
return (voidpf)(fixed_mem + *(intf *)q);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int inflate_trees_fixed(bl, bd, tl, td)
|
|
||||||
uIntf *bl; /* literal desired/actual bit depth */
|
uIntf *bl; /* literal desired/actual bit depth */
|
||||||
uIntf *bd; /* distance desired/actual bit depth */
|
uIntf *bd; /* distance desired/actual bit depth */
|
||||||
inflate_huft * FAR *tl; /* literal/length tree result */
|
inflate_huft * FAR *tl; /* literal/length tree result */
|
||||||
inflate_huft * FAR *td; /* distance tree result */
|
inflate_huft * FAR *td; /* distance tree result */
|
||||||
|
z_streamp z; /* for memory allocation */
|
||||||
{
|
{
|
||||||
/* build fixed tables if not already (multiple overlapped executions ok) */
|
#ifdef BUILDFIXED
|
||||||
|
/* build fixed tables if not already */
|
||||||
if (!fixed_built)
|
if (!fixed_built)
|
||||||
{
|
{
|
||||||
int k; /* temporary variable */
|
int k; /* temporary variable */
|
||||||
unsigned c[288]; /* length list for huft_build */
|
uInt f = 0; /* number of hufts used in fixed_mem */
|
||||||
z_stream z; /* for falloc function */
|
uIntf *c; /* length list for huft_build */
|
||||||
int f = FIXEDH; /* number of hufts left in fixed_mem */
|
uIntf *v; /* work area for huft_build */
|
||||||
|
|
||||||
/* set up fake z_stream for memory routines */
|
/* allocate memory */
|
||||||
z.zalloc = falloc;
|
if ((c = (uIntf*)ZALLOC(z, 288, sizeof(uInt))) == Z_NULL)
|
||||||
z.zfree = Z_NULL;
|
return Z_MEM_ERROR;
|
||||||
z.opaque = (voidpf)&f;
|
if ((v = (uIntf*)ZALLOC(z, 288, sizeof(uInt))) == Z_NULL)
|
||||||
|
{
|
||||||
|
ZFREE(z, c);
|
||||||
|
return Z_MEM_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
/* literal table */
|
/* literal table */
|
||||||
for (k = 0; k < 144; k++)
|
for (k = 0; k < 144; k++)
|
||||||
@ -428,52 +430,26 @@ inflate_huft * FAR *td; /* distance tree result */
|
|||||||
c[k] = 7;
|
c[k] = 7;
|
||||||
for (; k < 288; k++)
|
for (; k < 288; k++)
|
||||||
c[k] = 8;
|
c[k] = 8;
|
||||||
fixed_bl = 7;
|
fixed_bl = 9;
|
||||||
huft_build(c, 288, 257, cplens, cplext, &fixed_tl, &fixed_bl, &z);
|
huft_build(c, 288, 257, cplens, cplext, &fixed_tl, &fixed_bl,
|
||||||
|
fixed_mem, &f, v);
|
||||||
|
|
||||||
/* distance table */
|
/* distance table */
|
||||||
for (k = 0; k < 30; k++)
|
for (k = 0; k < 30; k++)
|
||||||
c[k] = 5;
|
c[k] = 5;
|
||||||
fixed_bd = 5;
|
fixed_bd = 5;
|
||||||
huft_build(c, 30, 0, cpdist, cpdext, &fixed_td, &fixed_bd, &z);
|
huft_build(c, 30, 0, cpdist, cpdext, &fixed_td, &fixed_bd,
|
||||||
|
fixed_mem, &f, v);
|
||||||
|
|
||||||
/* done */
|
/* done */
|
||||||
Assert(f == 0, "invalid build of fixed tables");
|
ZFREE(z, v);
|
||||||
|
ZFREE(z, c);
|
||||||
fixed_built = 1;
|
fixed_built = 1;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
*bl = fixed_bl;
|
*bl = fixed_bl;
|
||||||
*bd = fixed_bd;
|
*bd = fixed_bd;
|
||||||
*tl = fixed_tl;
|
*tl = fixed_tl;
|
||||||
*td = fixed_td;
|
*td = fixed_td;
|
||||||
return Z_OK;
|
return Z_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int inflate_trees_free(t, z)
|
|
||||||
inflate_huft *t; /* table to free */
|
|
||||||
z_streamp z; /* for zfree function */
|
|
||||||
/* Free the malloc'ed tables built by huft_build(), which makes a linked
|
|
||||||
list of the tables it made, with the links in a dummy first entry of
|
|
||||||
each table. */
|
|
||||||
{
|
|
||||||
register inflate_huft *p, *q, *r;
|
|
||||||
|
|
||||||
/* Reverse linked list */
|
|
||||||
p = Z_NULL;
|
|
||||||
q = t;
|
|
||||||
while (q != Z_NULL)
|
|
||||||
{
|
|
||||||
r = (q - 1)->next;
|
|
||||||
(q - 1)->next = p;
|
|
||||||
p = q;
|
|
||||||
q = r;
|
|
||||||
}
|
|
||||||
/* Go through linked list, freeing from the malloced (t[-1]) address. */
|
|
||||||
while (p != Z_NULL)
|
|
||||||
{
|
|
||||||
q = (--p)->next;
|
|
||||||
ZFREE(z,p);
|
|
||||||
p = q;
|
|
||||||
}
|
|
||||||
return Z_OK;
|
|
||||||
}
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* inftrees.h -- header to use inftrees.c
|
/* inftrees.h -- header to use inftrees.c
|
||||||
* Copyright (C) 1995-1996 Mark Adler
|
* Copyright (C) 1995-1998 Mark Adler
|
||||||
* For conditions of distribution and use, see copyright notice in zlib.h
|
* For conditions of distribution and use, see copyright notice in zlib.h
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@ -19,23 +19,25 @@ struct inflate_huft_s {
|
|||||||
Byte Exop; /* number of extra bits or operation */
|
Byte Exop; /* number of extra bits or operation */
|
||||||
Byte Bits; /* number of bits in this code or subcode */
|
Byte Bits; /* number of bits in this code or subcode */
|
||||||
} what;
|
} what;
|
||||||
Bytef *pad; /* pad structure to a power of 2 (4 bytes for */
|
uInt pad; /* pad structure to a power of 2 (4 bytes for */
|
||||||
} word; /* 16-bit, 8 bytes for 32-bit machines) */
|
} word; /* 16-bit, 8 bytes for 32-bit int's) */
|
||||||
union {
|
uInt base; /* literal, length base, distance base,
|
||||||
uInt Base; /* literal, length base, or distance base */
|
or table offset */
|
||||||
inflate_huft *Next; /* pointer to next level of table */
|
|
||||||
} more;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifdef DEBUG
|
/* Maximum size of dynamic tree. The maximum found in a long but non-
|
||||||
extern uInt inflate_hufts;
|
exhaustive search was 1004 huft structures (850 for length/literals
|
||||||
#endif
|
and 154 for distances, the latter actually the result of an
|
||||||
|
exhaustive search). The actual maximum is not known, but the
|
||||||
|
value below is more than safe. */
|
||||||
|
#define MANY 1440
|
||||||
|
|
||||||
extern int inflate_trees_bits OF((
|
extern int inflate_trees_bits OF((
|
||||||
uIntf *, /* 19 code lengths */
|
uIntf *, /* 19 code lengths */
|
||||||
uIntf *, /* bits tree desired/actual depth */
|
uIntf *, /* bits tree desired/actual depth */
|
||||||
inflate_huft * FAR *, /* bits tree result */
|
inflate_huft * FAR *, /* bits tree result */
|
||||||
z_streamp )); /* for zalloc, zfree functions */
|
inflate_huft *, /* space for trees */
|
||||||
|
z_streamp)); /* for messages */
|
||||||
|
|
||||||
extern int inflate_trees_dynamic OF((
|
extern int inflate_trees_dynamic OF((
|
||||||
uInt, /* number of literal/length codes */
|
uInt, /* number of literal/length codes */
|
||||||
@ -45,15 +47,12 @@ extern int inflate_trees_dynamic OF((
|
|||||||
uIntf *, /* distance desired/actual bit depth */
|
uIntf *, /* distance desired/actual bit depth */
|
||||||
inflate_huft * FAR *, /* literal/length tree result */
|
inflate_huft * FAR *, /* literal/length tree result */
|
||||||
inflate_huft * FAR *, /* distance tree result */
|
inflate_huft * FAR *, /* distance tree result */
|
||||||
z_streamp )); /* for zalloc, zfree functions */
|
inflate_huft *, /* space for trees */
|
||||||
|
z_streamp)); /* for messages */
|
||||||
|
|
||||||
extern int inflate_trees_fixed OF((
|
extern int inflate_trees_fixed OF((
|
||||||
uIntf *, /* literal desired/actual bit depth */
|
uIntf *, /* literal desired/actual bit depth */
|
||||||
uIntf *, /* distance desired/actual bit depth */
|
uIntf *, /* distance desired/actual bit depth */
|
||||||
inflate_huft * FAR *, /* literal/length tree result */
|
inflate_huft * FAR *, /* literal/length tree result */
|
||||||
inflate_huft * FAR *)); /* distance tree result */
|
inflate_huft * FAR *, /* distance tree result */
|
||||||
|
z_streamp)); /* for memory allocation */
|
||||||
extern int inflate_trees_free OF((
|
|
||||||
inflate_huft *, /* tables to free */
|
|
||||||
z_streamp )); /* for zfree function */
|
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* inflate_util.c -- data and routines common to blocks and codes
|
/* inflate_util.c -- data and routines common to blocks and codes
|
||||||
* Copyright (C) 1995-1996 Mark Adler
|
* Copyright (C) 1995-1998 Mark Adler
|
||||||
* For conditions of distribution and use, see copyright notice in zlib.h
|
* For conditions of distribution and use, see copyright notice in zlib.h
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* infutil.h -- types and macros common to blocks and codes
|
/* infutil.h -- types and macros common to blocks and codes
|
||||||
* Copyright (C) 1995-1996 Mark Adler
|
* Copyright (C) 1995-1998 Mark Adler
|
||||||
* For conditions of distribution and use, see copyright notice in zlib.h
|
* For conditions of distribution and use, see copyright notice in zlib.h
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@ -41,8 +41,6 @@ struct inflate_blocks_state {
|
|||||||
inflate_huft *tb; /* bit length decoding tree */
|
inflate_huft *tb; /* bit length decoding tree */
|
||||||
} trees; /* if DTREE, decoding info for trees */
|
} trees; /* if DTREE, decoding info for trees */
|
||||||
struct {
|
struct {
|
||||||
inflate_huft *tl;
|
|
||||||
inflate_huft *td; /* trees to free */
|
|
||||||
inflate_codes_statef
|
inflate_codes_statef
|
||||||
*codes;
|
*codes;
|
||||||
} decode; /* if CODES, current state */
|
} decode; /* if CODES, current state */
|
||||||
@ -52,6 +50,7 @@ struct inflate_blocks_state {
|
|||||||
/* mode independent information */
|
/* mode independent information */
|
||||||
uInt bitk; /* bits in bit buffer */
|
uInt bitk; /* bits in bit buffer */
|
||||||
uLong bitb; /* bit buffer */
|
uLong bitb; /* bit buffer */
|
||||||
|
inflate_huft *hufts; /* single malloc for tree space */
|
||||||
Bytef *window; /* sliding window */
|
Bytef *window; /* sliding window */
|
||||||
Bytef *end; /* one byte after sliding window */
|
Bytef *end; /* one byte after sliding window */
|
||||||
Bytef *read; /* window read pointer */
|
Bytef *read; /* window read pointer */
|
||||||
|
@ -50,6 +50,7 @@ DEPTH= ..\..\..\
|
|||||||
EXPORT_LIBRARY=1
|
EXPORT_LIBRARY=1
|
||||||
LIBRARY_NAME=$(MODULE)
|
LIBRARY_NAME=$(MODULE)
|
||||||
MAPFILE= $(LIBRARY_NAME).map
|
MAPFILE= $(LIBRARY_NAME).map
|
||||||
|
DEFFILE=zlib.def
|
||||||
|
|
||||||
#//------------------------------------------------------------------------
|
#//------------------------------------------------------------------------
|
||||||
#//
|
#//
|
||||||
@ -87,6 +88,8 @@ OBJS= \
|
|||||||
#// (ie. LCFLAGS, LLFLAGS, LLIBS, LINCS)
|
#// (ie. LCFLAGS, LLFLAGS, LLIBS, LINCS)
|
||||||
#//
|
#//
|
||||||
#//------------------------------------------------------------------------
|
#//------------------------------------------------------------------------
|
||||||
|
# Use standard win32 (but not standard for mozilla) entrypoints
|
||||||
|
LCFLAGS=$(LCFLAGS) -DZLIB_DLL=1
|
||||||
LLIBS=$(LLIBS) $(LIBNSPR)
|
LLIBS=$(LLIBS) $(LIBNSPR)
|
||||||
LINCS=$(LINCS) -I. -I_gen
|
LINCS=$(LINCS) -I. -I_gen
|
||||||
# clobber and clobber_all will remove the following garbage:
|
# clobber and clobber_all will remove the following garbage:
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* minigzip.c -- simulate gzip using the zlib compression library
|
/* minigzip.c -- simulate gzip using the zlib compression library
|
||||||
* Copyright (C) 1995-1996 Jean-loup Gailly.
|
* Copyright (C) 1995-1998 Jean-loup Gailly.
|
||||||
* For conditions of distribution and use, see copyright notice in zlib.h
|
* For conditions of distribution and use, see copyright notice in zlib.h
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@ -13,7 +13,7 @@
|
|||||||
* or in pipe mode.
|
* or in pipe mode.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* $Id: minigzip.c,v 3.1 1998/03/28 03:36:15 ltabb Exp $ */
|
/* @(#) $Id: minigzip.c,v 3.2 2001/06/30 23:38:01 leaf%mozilla.org Exp $ */
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include "zlib.h"
|
#include "zlib.h"
|
||||||
@ -25,6 +25,11 @@
|
|||||||
extern void exit OF((int));
|
extern void exit OF((int));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef USE_MMAP
|
||||||
|
# include <sys/types.h>
|
||||||
|
# include <sys/mman.h>
|
||||||
|
# include <sys/stat.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#if defined(MSDOS) || defined(OS2) || defined(WIN32)
|
#if defined(MSDOS) || defined(OS2) || defined(WIN32)
|
||||||
# include <fcntl.h>
|
# include <fcntl.h>
|
||||||
@ -43,31 +48,40 @@
|
|||||||
# define GZ_SUFFIX "-gz"
|
# define GZ_SUFFIX "-gz"
|
||||||
# define fileno(file) file->__file
|
# define fileno(file) file->__file
|
||||||
#endif
|
#endif
|
||||||
|
#if defined(__MWERKS__) && __dest_os != __be_os && __dest_os != __win32_os
|
||||||
|
# include <unix.h> /* for fileno */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef WIN32 /* unlink already in stdio.h for WIN32 */
|
||||||
|
extern int unlink OF((const char *));
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifndef GZ_SUFFIX
|
#ifndef GZ_SUFFIX
|
||||||
# define GZ_SUFFIX ".gz"
|
# define GZ_SUFFIX ".gz"
|
||||||
#endif
|
#endif
|
||||||
#define SUFFIX_LEN sizeof(GZ_SUFFIX)
|
#define SUFFIX_LEN (sizeof(GZ_SUFFIX)-1)
|
||||||
|
|
||||||
extern int unlink OF((const char *));
|
#define BUFLEN 16384
|
||||||
|
|
||||||
#define BUFLEN 4096
|
|
||||||
#define MAX_NAME_LEN 1024
|
#define MAX_NAME_LEN 1024
|
||||||
|
|
||||||
#define local static
|
#ifdef MAXSEG_64K
|
||||||
/* For MSDOS and other systems with limitation on stack size. For Unix,
|
# define local static
|
||||||
#define local
|
/* Needed for systems with limitation on stack size. */
|
||||||
works also.
|
#else
|
||||||
*/
|
# define local
|
||||||
|
#endif
|
||||||
|
|
||||||
char *prog;
|
char *prog;
|
||||||
|
|
||||||
void error OF((const char *msg));
|
void error OF((const char *msg));
|
||||||
void gz_compress OF((FILE *in, gzFile out));
|
void gz_compress OF((FILE *in, gzFile out));
|
||||||
void gz_uncompress OF((gzFile in, FILE *out));
|
#ifdef USE_MMAP
|
||||||
void file_compress OF((char *file));
|
int gz_compress_mmap OF((FILE *in, gzFile out));
|
||||||
void file_uncompress OF((char *file));
|
#endif
|
||||||
int main OF((int argc, char *argv[]));
|
void gz_uncompress OF((gzFile in, FILE *out));
|
||||||
|
void file_compress OF((char *file, char *mode));
|
||||||
|
void file_uncompress OF((char *file));
|
||||||
|
int main OF((int argc, char *argv[]));
|
||||||
|
|
||||||
/* ===========================================================================
|
/* ===========================================================================
|
||||||
* Display error message and exit
|
* Display error message and exit
|
||||||
@ -82,6 +96,7 @@ void error(msg)
|
|||||||
/* ===========================================================================
|
/* ===========================================================================
|
||||||
* Compress input to output then close both files.
|
* Compress input to output then close both files.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void gz_compress(in, out)
|
void gz_compress(in, out)
|
||||||
FILE *in;
|
FILE *in;
|
||||||
gzFile out;
|
gzFile out;
|
||||||
@ -90,6 +105,12 @@ void gz_compress(in, out)
|
|||||||
int len;
|
int len;
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
|
#ifdef USE_MMAP
|
||||||
|
/* Try first compressing with mmap. If mmap fails (minigzip used in a
|
||||||
|
* pipe), use the normal fread loop.
|
||||||
|
*/
|
||||||
|
if (gz_compress_mmap(in, out) == Z_OK) return;
|
||||||
|
#endif
|
||||||
for (;;) {
|
for (;;) {
|
||||||
len = fread(buf, 1, sizeof(buf), in);
|
len = fread(buf, 1, sizeof(buf), in);
|
||||||
if (ferror(in)) {
|
if (ferror(in)) {
|
||||||
@ -104,6 +125,43 @@ void gz_compress(in, out)
|
|||||||
if (gzclose(out) != Z_OK) error("failed gzclose");
|
if (gzclose(out) != Z_OK) error("failed gzclose");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef USE_MMAP /* MMAP version, Miguel Albrecht <malbrech@eso.org> */
|
||||||
|
|
||||||
|
/* Try compressing the input file at once using mmap. Return Z_OK if
|
||||||
|
* if success, Z_ERRNO otherwise.
|
||||||
|
*/
|
||||||
|
int gz_compress_mmap(in, out)
|
||||||
|
FILE *in;
|
||||||
|
gzFile out;
|
||||||
|
{
|
||||||
|
int len;
|
||||||
|
int err;
|
||||||
|
int ifd = fileno(in);
|
||||||
|
caddr_t buf; /* mmap'ed buffer for the entire input file */
|
||||||
|
off_t buf_len; /* length of the input file */
|
||||||
|
struct stat sb;
|
||||||
|
|
||||||
|
/* Determine the size of the file, needed for mmap: */
|
||||||
|
if (fstat(ifd, &sb) < 0) return Z_ERRNO;
|
||||||
|
buf_len = sb.st_size;
|
||||||
|
if (buf_len <= 0) return Z_ERRNO;
|
||||||
|
|
||||||
|
/* Now do the actual mmap: */
|
||||||
|
buf = mmap((caddr_t) 0, buf_len, PROT_READ, MAP_SHARED, ifd, (off_t)0);
|
||||||
|
if (buf == (caddr_t)(-1)) return Z_ERRNO;
|
||||||
|
|
||||||
|
/* Compress the whole file at once: */
|
||||||
|
len = gzwrite(out, (char *)buf, (unsigned)buf_len);
|
||||||
|
|
||||||
|
if (len != (int)buf_len) error(gzerror(out, &err));
|
||||||
|
|
||||||
|
munmap(buf, buf_len);
|
||||||
|
fclose(in);
|
||||||
|
if (gzclose(out) != Z_OK) error("failed gzclose");
|
||||||
|
return Z_OK;
|
||||||
|
}
|
||||||
|
#endif /* USE_MMAP */
|
||||||
|
|
||||||
/* ===========================================================================
|
/* ===========================================================================
|
||||||
* Uncompress input to output then close both files.
|
* Uncompress input to output then close both files.
|
||||||
*/
|
*/
|
||||||
@ -134,8 +192,9 @@ void gz_uncompress(in, out)
|
|||||||
* Compress the given file: create a corresponding .gz file and remove the
|
* Compress the given file: create a corresponding .gz file and remove the
|
||||||
* original.
|
* original.
|
||||||
*/
|
*/
|
||||||
void file_compress(file)
|
void file_compress(file, mode)
|
||||||
char *file;
|
char *file;
|
||||||
|
char *mode;
|
||||||
{
|
{
|
||||||
local char outfile[MAX_NAME_LEN];
|
local char outfile[MAX_NAME_LEN];
|
||||||
FILE *in;
|
FILE *in;
|
||||||
@ -149,7 +208,7 @@ void file_compress(file)
|
|||||||
perror(file);
|
perror(file);
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
out = gzopen(outfile, "wb"); /* use "wb9" for maximal compression */
|
out = gzopen(outfile, mode);
|
||||||
if (out == NULL) {
|
if (out == NULL) {
|
||||||
fprintf(stderr, "%s: can't gzopen %s\n", prog, outfile);
|
fprintf(stderr, "%s: can't gzopen %s\n", prog, outfile);
|
||||||
exit(1);
|
exit(1);
|
||||||
@ -201,7 +260,11 @@ void file_uncompress(file)
|
|||||||
|
|
||||||
|
|
||||||
/* ===========================================================================
|
/* ===========================================================================
|
||||||
* Usage: minigzip [-d] [files...]
|
* Usage: minigzip [-d] [-f] [-h] [-1 to -9] [files...]
|
||||||
|
* -d : decompress
|
||||||
|
* -f : compress with Z_FILTERED
|
||||||
|
* -h : compress with Z_HUFFMAN_ONLY
|
||||||
|
* -1 to -9 : compression level
|
||||||
*/
|
*/
|
||||||
|
|
||||||
int main(argc, argv)
|
int main(argc, argv)
|
||||||
@ -210,15 +273,26 @@ int main(argc, argv)
|
|||||||
{
|
{
|
||||||
int uncompr = 0;
|
int uncompr = 0;
|
||||||
gzFile file;
|
gzFile file;
|
||||||
|
char outmode[20];
|
||||||
|
|
||||||
|
strcpy(outmode, "wb6 ");
|
||||||
|
|
||||||
prog = argv[0];
|
prog = argv[0];
|
||||||
argc--, argv++;
|
argc--, argv++;
|
||||||
|
|
||||||
if (argc > 0) {
|
while (argc > 0) {
|
||||||
uncompr = (strcmp(*argv, "-d") == 0);
|
if (strcmp(*argv, "-d") == 0)
|
||||||
if (uncompr) {
|
uncompr = 1;
|
||||||
argc--, argv++;
|
else if (strcmp(*argv, "-f") == 0)
|
||||||
}
|
outmode[3] = 'f';
|
||||||
|
else if (strcmp(*argv, "-h") == 0)
|
||||||
|
outmode[3] = 'h';
|
||||||
|
else if ((*argv)[0] == '-' && (*argv)[1] >= '1' && (*argv)[1] <= '9' &&
|
||||||
|
(*argv)[2] == 0)
|
||||||
|
outmode[2] = (*argv)[1];
|
||||||
|
else
|
||||||
|
break;
|
||||||
|
argc--, argv++;
|
||||||
}
|
}
|
||||||
if (argc == 0) {
|
if (argc == 0) {
|
||||||
SET_BINARY_MODE(stdin);
|
SET_BINARY_MODE(stdin);
|
||||||
@ -228,7 +302,7 @@ int main(argc, argv)
|
|||||||
if (file == NULL) error("can't gzdopen stdin");
|
if (file == NULL) error("can't gzdopen stdin");
|
||||||
gz_uncompress(file, stdout);
|
gz_uncompress(file, stdout);
|
||||||
} else {
|
} else {
|
||||||
file = gzdopen(fileno(stdout), "wb"); /* "wb9" for max compr. */
|
file = gzdopen(fileno(stdout), outmode);
|
||||||
if (file == NULL) error("can't gzdopen stdout");
|
if (file == NULL) error("can't gzdopen stdout");
|
||||||
gz_compress(stdin, file);
|
gz_compress(stdin, file);
|
||||||
}
|
}
|
||||||
@ -237,7 +311,7 @@ int main(argc, argv)
|
|||||||
if (uncompr) {
|
if (uncompr) {
|
||||||
file_uncompress(*argv);
|
file_uncompress(*argv);
|
||||||
} else {
|
} else {
|
||||||
file_compress(*argv);
|
file_compress(*argv, outmode);
|
||||||
}
|
}
|
||||||
} while (argv++, --argc);
|
} while (argv++, --argc);
|
||||||
}
|
}
|
||||||
|
@ -26,6 +26,7 @@ MODULES_ZLIB_SRC_LCSRCS = \
|
|||||||
uncompr.c \
|
uncompr.c \
|
||||||
deflate.c \
|
deflate.c \
|
||||||
trees.c \
|
trees.c \
|
||||||
|
gzio.c \
|
||||||
zutil.c \
|
zutil.c \
|
||||||
inflate.c \
|
inflate.c \
|
||||||
infblock.c \
|
infblock.c \
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
/* trees.c -- output deflated data using Huffman coding
|
/* trees.c -- output deflated data using Huffman coding
|
||||||
* Copyright (C) 1995-1996 Jean-loup Gailly
|
* Copyright (C) 1995-1998 Jean-loup Gailly
|
||||||
* For conditions of distribution and use, see copyright notice in zlib.h
|
* For conditions of distribution and use, see copyright notice in zlib.h
|
||||||
*/
|
*/
|
||||||
/* This file was modified since it was taken from the zlib distribution */
|
|
||||||
/*
|
/*
|
||||||
* ALGORITHM
|
* ALGORITHM
|
||||||
*
|
*
|
||||||
@ -29,7 +29,9 @@
|
|||||||
* Addison-Wesley, 1983. ISBN 0-201-06672-6.
|
* Addison-Wesley, 1983. ISBN 0-201-06672-6.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* $Id: trees.c,v 3.1 1998/03/28 03:36:16 ltabb Exp $ */
|
/* @(#) $Id: trees.c,v 3.2 2001/06/30 23:38:02 leaf%mozilla.org Exp $ */
|
||||||
|
|
||||||
|
/* #define GEN_TREES_H */
|
||||||
|
|
||||||
#include "deflate.h"
|
#include "deflate.h"
|
||||||
|
|
||||||
@ -56,16 +58,16 @@
|
|||||||
#define REPZ_11_138 18
|
#define REPZ_11_138 18
|
||||||
/* repeat a zero length 11-138 times (7 bits of repeat count) */
|
/* repeat a zero length 11-138 times (7 bits of repeat count) */
|
||||||
|
|
||||||
local int extra_lbits[LENGTH_CODES] /* extra bits for each length code */
|
local const int extra_lbits[LENGTH_CODES] /* extra bits for each length code */
|
||||||
= {0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0};
|
= {0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0};
|
||||||
|
|
||||||
local int extra_dbits[D_CODES] /* extra bits for each distance code */
|
local const int extra_dbits[D_CODES] /* extra bits for each distance code */
|
||||||
= {0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13};
|
= {0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13};
|
||||||
|
|
||||||
local int extra_blbits[BL_CODES]/* extra bits for each bit length code */
|
local const int extra_blbits[BL_CODES]/* extra bits for each bit length code */
|
||||||
= {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7};
|
= {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7};
|
||||||
|
|
||||||
local uch bl_order[BL_CODES]
|
local const uch bl_order[BL_CODES]
|
||||||
= {16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15};
|
= {16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15};
|
||||||
/* The lengths of the bit length codes are sent in order of decreasing
|
/* The lengths of the bit length codes are sent in order of decreasing
|
||||||
* probability, to avoid transmitting the lengths for unused bit length codes.
|
* probability, to avoid transmitting the lengths for unused bit length codes.
|
||||||
@ -80,6 +82,11 @@ local uch bl_order[BL_CODES]
|
|||||||
* Local data. These are initialized only once.
|
* Local data. These are initialized only once.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#define DIST_CODE_LEN 512 /* see definition of array dist_code below */
|
||||||
|
|
||||||
|
#if defined(GEN_TREES_H) || !defined(STDC)
|
||||||
|
/* non ANSI compilers may not accept trees.h */
|
||||||
|
|
||||||
local ct_data static_ltree[L_CODES+2];
|
local ct_data static_ltree[L_CODES+2];
|
||||||
/* The static literal tree. Since the bit lengths are imposed, there is no
|
/* The static literal tree. Since the bit lengths are imposed, there is no
|
||||||
* need for the L_CODES extra codes used during heap construction. However
|
* need for the L_CODES extra codes used during heap construction. However
|
||||||
@ -92,13 +99,13 @@ local ct_data static_dtree[D_CODES];
|
|||||||
* 5 bits.)
|
* 5 bits.)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
local uch dist_code[512];
|
uch _dist_code[DIST_CODE_LEN];
|
||||||
/* distance codes. The first 256 values correspond to the distances
|
/* Distance codes. The first 256 values correspond to the distances
|
||||||
* 3 .. 258, the last 256 values correspond to the top 8 bits of
|
* 3 .. 258, the last 256 values correspond to the top 8 bits of
|
||||||
* the 15 bit distances.
|
* the 15 bit distances.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
local uch length_code[MAX_MATCH-MIN_MATCH+1];
|
uch _length_code[MAX_MATCH-MIN_MATCH+1];
|
||||||
/* length code for each normalized match length (0 == MIN_MATCH) */
|
/* length code for each normalized match length (0 == MIN_MATCH) */
|
||||||
|
|
||||||
local int base_length[LENGTH_CODES];
|
local int base_length[LENGTH_CODES];
|
||||||
@ -107,9 +114,13 @@ local int base_length[LENGTH_CODES];
|
|||||||
local int base_dist[D_CODES];
|
local int base_dist[D_CODES];
|
||||||
/* First normalized distance for each code (0 = distance of 1) */
|
/* First normalized distance for each code (0 = distance of 1) */
|
||||||
|
|
||||||
|
#else
|
||||||
|
# include "trees.h"
|
||||||
|
#endif /* GEN_TREES_H */
|
||||||
|
|
||||||
struct static_tree_desc_s {
|
struct static_tree_desc_s {
|
||||||
ct_data *static_tree; /* static tree or NULL */
|
const ct_data *static_tree; /* static tree or NULL */
|
||||||
intf *extra_bits; /* extra bits for each code or NULL */
|
const intf *extra_bits; /* extra bits for each code or NULL */
|
||||||
int extra_base; /* base index for extra_bits */
|
int extra_base; /* base index for extra_bits */
|
||||||
int elems; /* max number of elements in the tree */
|
int elems; /* max number of elements in the tree */
|
||||||
int max_length; /* max bit length for the codes */
|
int max_length; /* max bit length for the codes */
|
||||||
@ -122,7 +133,7 @@ local static_tree_desc static_d_desc =
|
|||||||
{static_dtree, extra_dbits, 0, D_CODES, MAX_BITS};
|
{static_dtree, extra_dbits, 0, D_CODES, MAX_BITS};
|
||||||
|
|
||||||
local static_tree_desc static_bl_desc =
|
local static_tree_desc static_bl_desc =
|
||||||
{(ct_data *)0, extra_blbits, 0, BL_CODES, MAX_BL_BITS};
|
{(const ct_data *)0, extra_blbits, 0, BL_CODES, MAX_BL_BITS};
|
||||||
|
|
||||||
/* ===========================================================================
|
/* ===========================================================================
|
||||||
* Local (static) routines in this file.
|
* Local (static) routines in this file.
|
||||||
@ -148,23 +159,20 @@ local void bi_flush OF((deflate_state *s));
|
|||||||
local void copy_block OF((deflate_state *s, charf *buf, unsigned len,
|
local void copy_block OF((deflate_state *s, charf *buf, unsigned len,
|
||||||
int header));
|
int header));
|
||||||
|
|
||||||
#ifndef DEBUG_NEVER
|
#ifdef GEN_TREES_H
|
||||||
|
local void gen_trees_header OF((void));
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef DEBUG
|
||||||
# define send_code(s, c, tree) send_bits(s, tree[c].Code, tree[c].Len)
|
# define send_code(s, c, tree) send_bits(s, tree[c].Code, tree[c].Len)
|
||||||
/* Send a code of the given tree. c and tree must not have side effects */
|
/* Send a code of the given tree. c and tree must not have side effects */
|
||||||
|
|
||||||
#else /* DEBUG */
|
#else /* DEBUG */
|
||||||
# define send_code(s, c, tree) \
|
# define send_code(s, c, tree) \
|
||||||
{ if (verbose>2) fprintf(stderr,"\ncd %3d ",(c)); \
|
{ if (z_verbose>2) fprintf(stderr,"\ncd %3d ",(c)); \
|
||||||
send_bits(s, tree[c].Code, tree[c].Len); }
|
send_bits(s, tree[c].Code, tree[c].Len); }
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define d_code(dist) \
|
|
||||||
((dist) < 256 ? dist_code[dist] : dist_code[256+((dist)>>7)])
|
|
||||||
/* Mapping from a distance to a distance code. dist is the distance - 1 and
|
|
||||||
* must not have side effects. dist_code[256] and dist_code[257] are never
|
|
||||||
* used.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* ===========================================================================
|
/* ===========================================================================
|
||||||
* Output a short LSB first on the stream.
|
* Output a short LSB first on the stream.
|
||||||
* IN assertion: there is enough room in pendingBuf.
|
* IN assertion: there is enough room in pendingBuf.
|
||||||
@ -222,18 +230,15 @@ local void send_bits(s, value, length)
|
|||||||
#endif /* DEBUG */
|
#endif /* DEBUG */
|
||||||
|
|
||||||
|
|
||||||
#ifndef MAX
|
|
||||||
#define MAX(a,b) (a >= b ? a : b)
|
#define MAX(a,b) (a >= b ? a : b)
|
||||||
#endif
|
|
||||||
/* the arguments must not have side effects */
|
/* the arguments must not have side effects */
|
||||||
|
|
||||||
/* ===========================================================================
|
/* ===========================================================================
|
||||||
* Initialize the various 'constant' tables. In a multi-threaded environment,
|
* Initialize the various 'constant' tables.
|
||||||
* this function may be called by two threads concurrently, but this is
|
|
||||||
* harmless since both invocations do exactly the same thing.
|
|
||||||
*/
|
*/
|
||||||
local void tr_static_init()
|
local void tr_static_init()
|
||||||
{
|
{
|
||||||
|
#if defined(GEN_TREES_H) || !defined(STDC)
|
||||||
static int static_init_done = 0;
|
static int static_init_done = 0;
|
||||||
int n; /* iterates over tree elements */
|
int n; /* iterates over tree elements */
|
||||||
int bits; /* bit counter */
|
int bits; /* bit counter */
|
||||||
@ -245,12 +250,19 @@ local void tr_static_init()
|
|||||||
|
|
||||||
if (static_init_done) return;
|
if (static_init_done) return;
|
||||||
|
|
||||||
|
/* For some embedded targets, global variables are not initialized: */
|
||||||
|
static_l_desc.static_tree = static_ltree;
|
||||||
|
static_l_desc.extra_bits = extra_lbits;
|
||||||
|
static_d_desc.static_tree = static_dtree;
|
||||||
|
static_d_desc.extra_bits = extra_dbits;
|
||||||
|
static_bl_desc.extra_bits = extra_blbits;
|
||||||
|
|
||||||
/* Initialize the mapping length (0..255) -> length code (0..28) */
|
/* Initialize the mapping length (0..255) -> length code (0..28) */
|
||||||
length = 0;
|
length = 0;
|
||||||
for (code = 0; code < LENGTH_CODES-1; code++) {
|
for (code = 0; code < LENGTH_CODES-1; code++) {
|
||||||
base_length[code] = length;
|
base_length[code] = length;
|
||||||
for (n = 0; n < (1<<extra_lbits[code]); n++) {
|
for (n = 0; n < (1<<extra_lbits[code]); n++) {
|
||||||
length_code[length++] = (uch)code;
|
_length_code[length++] = (uch)code;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Assert (length == 256, "tr_static_init: length != 256");
|
Assert (length == 256, "tr_static_init: length != 256");
|
||||||
@ -258,14 +270,14 @@ local void tr_static_init()
|
|||||||
* in two different ways: code 284 + 5 bits or code 285, so we
|
* in two different ways: code 284 + 5 bits or code 285, so we
|
||||||
* overwrite length_code[255] to use the best encoding:
|
* overwrite length_code[255] to use the best encoding:
|
||||||
*/
|
*/
|
||||||
length_code[length-1] = (uch)code;
|
_length_code[length-1] = (uch)code;
|
||||||
|
|
||||||
/* Initialize the mapping dist (0..32K) -> dist code (0..29) */
|
/* Initialize the mapping dist (0..32K) -> dist code (0..29) */
|
||||||
dist = 0;
|
dist = 0;
|
||||||
for (code = 0 ; code < 16; code++) {
|
for (code = 0 ; code < 16; code++) {
|
||||||
base_dist[code] = dist;
|
base_dist[code] = dist;
|
||||||
for (n = 0; n < (1<<extra_dbits[code]); n++) {
|
for (n = 0; n < (1<<extra_dbits[code]); n++) {
|
||||||
dist_code[dist++] = (uch)code;
|
_dist_code[dist++] = (uch)code;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Assert (dist == 256, "tr_static_init: dist != 256");
|
Assert (dist == 256, "tr_static_init: dist != 256");
|
||||||
@ -273,7 +285,7 @@ local void tr_static_init()
|
|||||||
for ( ; code < D_CODES; code++) {
|
for ( ; code < D_CODES; code++) {
|
||||||
base_dist[code] = dist << 7;
|
base_dist[code] = dist << 7;
|
||||||
for (n = 0; n < (1<<(extra_dbits[code]-7)); n++) {
|
for (n = 0; n < (1<<(extra_dbits[code]-7)); n++) {
|
||||||
dist_code[256 + dist++] = (uch)code;
|
_dist_code[256 + dist++] = (uch)code;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Assert (dist == 256, "tr_static_init: 256+dist != 512");
|
Assert (dist == 256, "tr_static_init: 256+dist != 512");
|
||||||
@ -297,8 +309,74 @@ local void tr_static_init()
|
|||||||
static_dtree[n].Code = bi_reverse((unsigned)n, 5);
|
static_dtree[n].Code = bi_reverse((unsigned)n, 5);
|
||||||
}
|
}
|
||||||
static_init_done = 1;
|
static_init_done = 1;
|
||||||
|
|
||||||
|
# ifdef GEN_TREES_H
|
||||||
|
gen_trees_header();
|
||||||
|
# endif
|
||||||
|
#endif /* defined(GEN_TREES_H) || !defined(STDC) */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* ===========================================================================
|
||||||
|
* Genererate the file trees.h describing the static trees.
|
||||||
|
*/
|
||||||
|
#ifdef GEN_TREES_H
|
||||||
|
# ifndef DEBUG
|
||||||
|
# include <stdio.h>
|
||||||
|
# endif
|
||||||
|
|
||||||
|
# define SEPARATOR(i, last, width) \
|
||||||
|
((i) == (last)? "\n};\n\n" : \
|
||||||
|
((i) % (width) == (width)-1 ? ",\n" : ", "))
|
||||||
|
|
||||||
|
void gen_trees_header()
|
||||||
|
{
|
||||||
|
FILE *header = fopen("trees.h", "w");
|
||||||
|
int i;
|
||||||
|
|
||||||
|
Assert (header != NULL, "Can't open trees.h");
|
||||||
|
fprintf(header,
|
||||||
|
"/* header created automatically with -DGEN_TREES_H */\n\n");
|
||||||
|
|
||||||
|
fprintf(header, "local const ct_data static_ltree[L_CODES+2] = {\n");
|
||||||
|
for (i = 0; i < L_CODES+2; i++) {
|
||||||
|
fprintf(header, "{{%3u},{%3u}}%s", static_ltree[i].Code,
|
||||||
|
static_ltree[i].Len, SEPARATOR(i, L_CODES+1, 5));
|
||||||
|
}
|
||||||
|
|
||||||
|
fprintf(header, "local const ct_data static_dtree[D_CODES] = {\n");
|
||||||
|
for (i = 0; i < D_CODES; i++) {
|
||||||
|
fprintf(header, "{{%2u},{%2u}}%s", static_dtree[i].Code,
|
||||||
|
static_dtree[i].Len, SEPARATOR(i, D_CODES-1, 5));
|
||||||
|
}
|
||||||
|
|
||||||
|
fprintf(header, "const uch _dist_code[DIST_CODE_LEN] = {\n");
|
||||||
|
for (i = 0; i < DIST_CODE_LEN; i++) {
|
||||||
|
fprintf(header, "%2u%s", _dist_code[i],
|
||||||
|
SEPARATOR(i, DIST_CODE_LEN-1, 20));
|
||||||
|
}
|
||||||
|
|
||||||
|
fprintf(header, "const uch _length_code[MAX_MATCH-MIN_MATCH+1]= {\n");
|
||||||
|
for (i = 0; i < MAX_MATCH-MIN_MATCH+1; i++) {
|
||||||
|
fprintf(header, "%2u%s", _length_code[i],
|
||||||
|
SEPARATOR(i, MAX_MATCH-MIN_MATCH, 20));
|
||||||
|
}
|
||||||
|
|
||||||
|
fprintf(header, "local const int base_length[LENGTH_CODES] = {\n");
|
||||||
|
for (i = 0; i < LENGTH_CODES; i++) {
|
||||||
|
fprintf(header, "%1u%s", base_length[i],
|
||||||
|
SEPARATOR(i, LENGTH_CODES-1, 20));
|
||||||
|
}
|
||||||
|
|
||||||
|
fprintf(header, "local const int base_dist[D_CODES] = {\n");
|
||||||
|
for (i = 0; i < D_CODES; i++) {
|
||||||
|
fprintf(header, "%5u%s", base_dist[i],
|
||||||
|
SEPARATOR(i, D_CODES-1, 10));
|
||||||
|
}
|
||||||
|
|
||||||
|
fclose(header);
|
||||||
|
}
|
||||||
|
#endif /* GEN_TREES_H */
|
||||||
|
|
||||||
/* ===========================================================================
|
/* ===========================================================================
|
||||||
* Initialize the tree data structures for a new zlib stream.
|
* Initialize the tree data structures for a new zlib stream.
|
||||||
*/
|
*/
|
||||||
@ -307,8 +385,6 @@ void _tr_init(s)
|
|||||||
{
|
{
|
||||||
tr_static_init();
|
tr_static_init();
|
||||||
|
|
||||||
s->compressed_len = 0L;
|
|
||||||
|
|
||||||
s->l_desc.dyn_tree = s->dyn_ltree;
|
s->l_desc.dyn_tree = s->dyn_ltree;
|
||||||
s->l_desc.stat_desc = &static_l_desc;
|
s->l_desc.stat_desc = &static_l_desc;
|
||||||
|
|
||||||
@ -322,6 +398,7 @@ void _tr_init(s)
|
|||||||
s->bi_valid = 0;
|
s->bi_valid = 0;
|
||||||
s->last_eob_len = 8; /* enough lookahead for inflate */
|
s->last_eob_len = 8; /* enough lookahead for inflate */
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
|
s->compressed_len = 0L;
|
||||||
s->bits_sent = 0L;
|
s->bits_sent = 0L;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -415,12 +492,12 @@ local void gen_bitlen(s, desc)
|
|||||||
deflate_state *s;
|
deflate_state *s;
|
||||||
tree_desc *desc; /* the tree descriptor */
|
tree_desc *desc; /* the tree descriptor */
|
||||||
{
|
{
|
||||||
ct_data *tree = desc->dyn_tree;
|
ct_data *tree = desc->dyn_tree;
|
||||||
int max_code = desc->max_code;
|
int max_code = desc->max_code;
|
||||||
ct_data *stree = desc->stat_desc->static_tree;
|
const ct_data *stree = desc->stat_desc->static_tree;
|
||||||
intf *extra = desc->stat_desc->extra_bits;
|
const intf *extra = desc->stat_desc->extra_bits;
|
||||||
int base = desc->stat_desc->extra_base;
|
int base = desc->stat_desc->extra_base;
|
||||||
int max_length = desc->stat_desc->max_length;
|
int max_length = desc->stat_desc->max_length;
|
||||||
int h; /* heap index */
|
int h; /* heap index */
|
||||||
int n, m; /* iterate over the tree elements */
|
int n, m; /* iterate over the tree elements */
|
||||||
int bits; /* bit length */
|
int bits; /* bit length */
|
||||||
@ -544,9 +621,9 @@ local void build_tree(s, desc)
|
|||||||
deflate_state *s;
|
deflate_state *s;
|
||||||
tree_desc *desc; /* the tree descriptor */
|
tree_desc *desc; /* the tree descriptor */
|
||||||
{
|
{
|
||||||
ct_data *tree = desc->dyn_tree;
|
ct_data *tree = desc->dyn_tree;
|
||||||
ct_data *stree = desc->stat_desc->static_tree;
|
const ct_data *stree = desc->stat_desc->static_tree;
|
||||||
int elems = desc->stat_desc->elems;
|
int elems = desc->stat_desc->elems;
|
||||||
int n, m; /* iterate over heap elements */
|
int n, m; /* iterate over heap elements */
|
||||||
int max_code = -1; /* largest code with non zero frequency */
|
int max_code = -1; /* largest code with non zero frequency */
|
||||||
int node; /* new node being created */
|
int node; /* new node being created */
|
||||||
@ -794,9 +871,10 @@ void _tr_stored_block(s, buf, stored_len, eof)
|
|||||||
int eof; /* true if this is the last block for a file */
|
int eof; /* true if this is the last block for a file */
|
||||||
{
|
{
|
||||||
send_bits(s, (STORED_BLOCK<<1)+eof, 3); /* send block type */
|
send_bits(s, (STORED_BLOCK<<1)+eof, 3); /* send block type */
|
||||||
|
#ifdef DEBUG
|
||||||
s->compressed_len = (s->compressed_len + 3 + 7) & (ulg)~7L;
|
s->compressed_len = (s->compressed_len + 3 + 7) & (ulg)~7L;
|
||||||
s->compressed_len += (stored_len + 4) << 3;
|
s->compressed_len += (stored_len + 4) << 3;
|
||||||
|
#endif
|
||||||
copy_block(s, buf, (unsigned)stored_len, 1); /* with header */
|
copy_block(s, buf, (unsigned)stored_len, 1); /* with header */
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -816,7 +894,9 @@ void _tr_align(s)
|
|||||||
{
|
{
|
||||||
send_bits(s, STATIC_TREES<<1, 3);
|
send_bits(s, STATIC_TREES<<1, 3);
|
||||||
send_code(s, END_BLOCK, static_ltree);
|
send_code(s, END_BLOCK, static_ltree);
|
||||||
|
#ifdef DEBUG
|
||||||
s->compressed_len += 10L; /* 3 for block type, 7 for EOB */
|
s->compressed_len += 10L; /* 3 for block type, 7 for EOB */
|
||||||
|
#endif
|
||||||
bi_flush(s);
|
bi_flush(s);
|
||||||
/* Of the 10 bits for the empty block, we have already sent
|
/* Of the 10 bits for the empty block, we have already sent
|
||||||
* (10 - bi_valid) bits. The lookahead for the last real code (before
|
* (10 - bi_valid) bits. The lookahead for the last real code (before
|
||||||
@ -826,7 +906,9 @@ void _tr_align(s)
|
|||||||
if (1 + s->last_eob_len + 10 - s->bi_valid < 9) {
|
if (1 + s->last_eob_len + 10 - s->bi_valid < 9) {
|
||||||
send_bits(s, STATIC_TREES<<1, 3);
|
send_bits(s, STATIC_TREES<<1, 3);
|
||||||
send_code(s, END_BLOCK, static_ltree);
|
send_code(s, END_BLOCK, static_ltree);
|
||||||
|
#ifdef DEBUG
|
||||||
s->compressed_len += 10L;
|
s->compressed_len += 10L;
|
||||||
|
#endif
|
||||||
bi_flush(s);
|
bi_flush(s);
|
||||||
}
|
}
|
||||||
s->last_eob_len = 7;
|
s->last_eob_len = 7;
|
||||||
@ -834,10 +916,9 @@ void _tr_align(s)
|
|||||||
|
|
||||||
/* ===========================================================================
|
/* ===========================================================================
|
||||||
* Determine the best encoding for the current block: dynamic trees, static
|
* Determine the best encoding for the current block: dynamic trees, static
|
||||||
* trees or store, and output the encoded block to the zip file. This function
|
* trees or store, and output the encoded block to the zip file.
|
||||||
* returns the total compressed length for the file so far.
|
|
||||||
*/
|
*/
|
||||||
ulg _tr_flush_block(s, buf, stored_len, eof)
|
void _tr_flush_block(s, buf, stored_len, eof)
|
||||||
deflate_state *s;
|
deflate_state *s;
|
||||||
charf *buf; /* input block, or NULL if too old */
|
charf *buf; /* input block, or NULL if too old */
|
||||||
ulg stored_len; /* length of input block */
|
ulg stored_len; /* length of input block */
|
||||||
@ -884,25 +965,6 @@ ulg _tr_flush_block(s, buf, stored_len, eof)
|
|||||||
opt_lenb = static_lenb = stored_len + 5; /* force a stored block */
|
opt_lenb = static_lenb = stored_len + 5; /* force a stored block */
|
||||||
}
|
}
|
||||||
|
|
||||||
/* If compression failed and this is the first and last block,
|
|
||||||
* and if the .zip file can be seeked (to rewrite the local header),
|
|
||||||
* the whole file is transformed into a stored file:
|
|
||||||
*/
|
|
||||||
#ifdef STORED_FILE_OK
|
|
||||||
# ifdef FORCE_STORED_FILE
|
|
||||||
if (eof && s->compressed_len == 0L) { /* force stored file */
|
|
||||||
# else
|
|
||||||
if (stored_len <= opt_lenb && eof && s->compressed_len==0L && seekable()) {
|
|
||||||
# endif
|
|
||||||
/* Since LIT_BUFSIZE <= 2*WSIZE, the input data must be there: */
|
|
||||||
if (buf == (charf*)0) error ("block vanished");
|
|
||||||
|
|
||||||
copy_block(buf, (unsigned)stored_len, 0); /* without header */
|
|
||||||
s->compressed_len = stored_len << 3;
|
|
||||||
s->method = STORED;
|
|
||||||
} else
|
|
||||||
#endif /* STORED_FILE_OK */
|
|
||||||
|
|
||||||
#ifdef FORCE_STORED
|
#ifdef FORCE_STORED
|
||||||
if (buf != (char*)0) { /* force stored block */
|
if (buf != (char*)0) { /* force stored block */
|
||||||
#else
|
#else
|
||||||
@ -924,25 +986,32 @@ ulg _tr_flush_block(s, buf, stored_len, eof)
|
|||||||
#endif
|
#endif
|
||||||
send_bits(s, (STATIC_TREES<<1)+eof, 3);
|
send_bits(s, (STATIC_TREES<<1)+eof, 3);
|
||||||
compress_block(s, (ct_data *)static_ltree, (ct_data *)static_dtree);
|
compress_block(s, (ct_data *)static_ltree, (ct_data *)static_dtree);
|
||||||
|
#ifdef DEBUG
|
||||||
s->compressed_len += 3 + s->static_len;
|
s->compressed_len += 3 + s->static_len;
|
||||||
|
#endif
|
||||||
} else {
|
} else {
|
||||||
send_bits(s, (DYN_TREES<<1)+eof, 3);
|
send_bits(s, (DYN_TREES<<1)+eof, 3);
|
||||||
send_all_trees(s, s->l_desc.max_code+1, s->d_desc.max_code+1,
|
send_all_trees(s, s->l_desc.max_code+1, s->d_desc.max_code+1,
|
||||||
max_blindex+1);
|
max_blindex+1);
|
||||||
compress_block(s, (ct_data *)s->dyn_ltree, (ct_data *)s->dyn_dtree);
|
compress_block(s, (ct_data *)s->dyn_ltree, (ct_data *)s->dyn_dtree);
|
||||||
|
#ifdef DEBUG
|
||||||
s->compressed_len += 3 + s->opt_len;
|
s->compressed_len += 3 + s->opt_len;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
Assert (s->compressed_len == s->bits_sent, "bad compressed size");
|
Assert (s->compressed_len == s->bits_sent, "bad compressed size");
|
||||||
|
/* The above check is made mod 2^32, for files larger than 512 MB
|
||||||
|
* and uLong implemented on 32 bits.
|
||||||
|
*/
|
||||||
init_block(s);
|
init_block(s);
|
||||||
|
|
||||||
if (eof) {
|
if (eof) {
|
||||||
bi_windup(s);
|
bi_windup(s);
|
||||||
|
#ifdef DEBUG
|
||||||
s->compressed_len += 7; /* align on byte boundary */
|
s->compressed_len += 7; /* align on byte boundary */
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
Tracev((stderr,"\ncomprlen %lu(%lu) ", s->compressed_len>>3,
|
Tracev((stderr,"\ncomprlen %lu(%lu) ", s->compressed_len>>3,
|
||||||
s->compressed_len-7*eof));
|
s->compressed_len-7*eof));
|
||||||
|
|
||||||
return s->compressed_len >> 3;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ===========================================================================
|
/* ===========================================================================
|
||||||
@ -967,12 +1036,13 @@ int _tr_tally (s, dist, lc)
|
|||||||
(ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) &&
|
(ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) &&
|
||||||
(ush)d_code(dist) < (ush)D_CODES, "_tr_tally: bad match");
|
(ush)d_code(dist) < (ush)D_CODES, "_tr_tally: bad match");
|
||||||
|
|
||||||
s->dyn_ltree[length_code[lc]+LITERALS+1].Freq++;
|
s->dyn_ltree[_length_code[lc]+LITERALS+1].Freq++;
|
||||||
s->dyn_dtree[d_code(dist)].Freq++;
|
s->dyn_dtree[d_code(dist)].Freq++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef TRUNCATE_BLOCK
|
||||||
/* Try to guess if it is profitable to stop the current block here */
|
/* Try to guess if it is profitable to stop the current block here */
|
||||||
if (s->level > 2 && (s->last_lit & 0xfff) == 0) {
|
if ((s->last_lit & 0x1fff) == 0 && s->level > 2) {
|
||||||
/* Compute an upper bound for the compressed length */
|
/* Compute an upper bound for the compressed length */
|
||||||
ulg out_length = (ulg)s->last_lit*8L;
|
ulg out_length = (ulg)s->last_lit*8L;
|
||||||
ulg in_length = (ulg)((long)s->strstart - s->block_start);
|
ulg in_length = (ulg)((long)s->strstart - s->block_start);
|
||||||
@ -987,6 +1057,7 @@ int _tr_tally (s, dist, lc)
|
|||||||
100L - out_length*100L/in_length));
|
100L - out_length*100L/in_length));
|
||||||
if (s->matches < s->last_lit/2 && out_length < in_length/2) return 1;
|
if (s->matches < s->last_lit/2 && out_length < in_length/2) return 1;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
return (s->last_lit == s->lit_bufsize-1);
|
return (s->last_lit == s->lit_bufsize-1);
|
||||||
/* We avoid equality with lit_bufsize because of wraparound at 64K
|
/* We avoid equality with lit_bufsize because of wraparound at 64K
|
||||||
* on 16 bit machines and because stored blocks are restricted to
|
* on 16 bit machines and because stored blocks are restricted to
|
||||||
@ -1016,7 +1087,7 @@ local void compress_block(s, ltree, dtree)
|
|||||||
Tracecv(isgraph(lc), (stderr," '%c' ", lc));
|
Tracecv(isgraph(lc), (stderr," '%c' ", lc));
|
||||||
} else {
|
} else {
|
||||||
/* Here, lc is the match length - MIN_MATCH */
|
/* Here, lc is the match length - MIN_MATCH */
|
||||||
code = length_code[lc];
|
code = _length_code[lc];
|
||||||
send_code(s, code+LITERALS+1, ltree); /* send the length code */
|
send_code(s, code+LITERALS+1, ltree); /* send the length code */
|
||||||
extra = extra_lbits[code];
|
extra = extra_lbits[code];
|
||||||
if (extra != 0) {
|
if (extra != 0) {
|
||||||
@ -1036,7 +1107,7 @@ local void compress_block(s, ltree, dtree)
|
|||||||
} /* literal or match pair ? */
|
} /* literal or match pair ? */
|
||||||
|
|
||||||
/* Check that the overlay between pending_buf and d_buf+l_buf is ok: */
|
/* Check that the overlay between pending_buf and d_buf+l_buf is ok: */
|
||||||
Assert((uInt)s->pending < s->lit_bufsize + 2*lx, "pendingBuf overflow");
|
Assert(s->pending < s->lit_bufsize + 2*lx, "pendingBuf overflow");
|
||||||
|
|
||||||
} while (lx < s->last_lit);
|
} while (lx < s->last_lit);
|
||||||
|
|
||||||
|
@ -1,9 +1,9 @@
|
|||||||
/* uncompr.c -- decompress a memory buffer
|
/* uncompr.c -- decompress a memory buffer
|
||||||
* Copyright (C) 1995-1996 Jean-loup Gailly.
|
* Copyright (C) 1995-1998 Jean-loup Gailly.
|
||||||
* For conditions of distribution and use, see copyright notice in zlib.h
|
* For conditions of distribution and use, see copyright notice in zlib.h
|
||||||
*/
|
*/
|
||||||
/* This file was modified since it was taken from the zlib distribution */
|
|
||||||
/* $Id: uncompr.c,v 3.1 1998/03/28 03:36:16 ltabb Exp $ */
|
/* @(#) $Id: uncompr.c,v 3.2 2001/06/30 23:38:02 leaf%mozilla.org Exp $ */
|
||||||
|
|
||||||
#include "zlib.h"
|
#include "zlib.h"
|
||||||
|
|
||||||
@ -22,7 +22,7 @@
|
|||||||
enough memory, Z_BUF_ERROR if there was not enough room in the output
|
enough memory, Z_BUF_ERROR if there was not enough room in the output
|
||||||
buffer, or Z_DATA_ERROR if the input data was corrupted.
|
buffer, or Z_DATA_ERROR if the input data was corrupted.
|
||||||
*/
|
*/
|
||||||
PR_PUBLIC_API(int) uncompress (dest, destLen, source, sourceLen)
|
int ZEXPORT uncompress (dest, destLen, source, sourceLen)
|
||||||
Bytef *dest;
|
Bytef *dest;
|
||||||
uLongf *destLen;
|
uLongf *destLen;
|
||||||
const Bytef *source;
|
const Bytef *source;
|
||||||
@ -49,7 +49,7 @@ PR_PUBLIC_API(int) uncompress (dest, destLen, source, sourceLen)
|
|||||||
err = inflate(&stream, Z_FINISH);
|
err = inflate(&stream, Z_FINISH);
|
||||||
if (err != Z_STREAM_END) {
|
if (err != Z_STREAM_END) {
|
||||||
inflateEnd(&stream);
|
inflateEnd(&stream);
|
||||||
return err;
|
return err == Z_OK ? Z_BUF_ERROR : err;
|
||||||
}
|
}
|
||||||
*destLen = stream.total_out;
|
*destLen = stream.total_out;
|
||||||
|
|
||||||
|
@ -1,9 +1,9 @@
|
|||||||
/* zconf.h -- configuration of the zlib compression library
|
/* zconf.h -- configuration of the zlib compression library
|
||||||
* Copyright (C) 1995-1996 Jean-loup Gailly.
|
* Copyright (C) 1995-1998 Jean-loup Gailly.
|
||||||
* For conditions of distribution and use, see copyright notice in zlib.h
|
* For conditions of distribution and use, see copyright notice in zlib.h
|
||||||
*/
|
*/
|
||||||
/* This file was modified since it was taken from the zlib distribution */
|
|
||||||
/* $Id: zconf.h,v 3.3 1999/09/07 21:23:09 dveditz%netscape.com Exp $ */
|
/* @(#) $Id: zconf.h,v 3.4 2001/06/30 23:38:02 leaf%mozilla.org Exp $ */
|
||||||
|
|
||||||
#ifndef _ZCONF_H
|
#ifndef _ZCONF_H
|
||||||
#define _ZCONF_H
|
#define _ZCONF_H
|
||||||
@ -27,8 +27,10 @@
|
|||||||
# define inflateInit2_ z_inflateInit2_
|
# define inflateInit2_ z_inflateInit2_
|
||||||
# define inflateSetDictionary z_inflateSetDictionary
|
# define inflateSetDictionary z_inflateSetDictionary
|
||||||
# define inflateSync z_inflateSync
|
# define inflateSync z_inflateSync
|
||||||
|
# define inflateSyncPoint z_inflateSyncPoint
|
||||||
# define inflateReset z_inflateReset
|
# define inflateReset z_inflateReset
|
||||||
# define compress z_compress
|
# define compress z_compress
|
||||||
|
# define compress2 z_compress2
|
||||||
# define uncompress z_uncompress
|
# define uncompress z_uncompress
|
||||||
# define adler32 z_adler32
|
# define adler32 z_adler32
|
||||||
# define crc32 z_crc32
|
# define crc32 z_crc32
|
||||||
@ -69,11 +71,13 @@
|
|||||||
# define UNALIGNED_OK
|
# define UNALIGNED_OK
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if (defined(MSDOS) || defined(_WINDOWS) || defined(WIN32) || defined(XP_OS2)) && !defined(STDC)
|
#if (defined(MSDOS) || defined(_WINDOWS) || defined(WIN32)) && !defined(STDC)
|
||||||
# define STDC
|
# define STDC
|
||||||
#endif
|
#endif
|
||||||
#if (defined(__STDC__) || defined(__cplusplus)) && !defined(STDC)
|
#if defined(__STDC__) || defined(__cplusplus) || defined(__OS2__)
|
||||||
# define STDC
|
# ifndef STDC
|
||||||
|
# define STDC
|
||||||
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef STDC
|
#ifndef STDC
|
||||||
@ -87,6 +91,12 @@
|
|||||||
# define NO_DUMMY_DECL
|
# define NO_DUMMY_DECL
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* Old Borland C incorrectly complains about missing returns: */
|
||||||
|
#if defined(__BORLANDC__) && (__BORLANDC__ < 0x500)
|
||||||
|
# define NEED_DUMMY_RETURN
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/* Maximum value for memLevel in deflateInit2 */
|
/* Maximum value for memLevel in deflateInit2 */
|
||||||
#ifndef MAX_MEM_LEVEL
|
#ifndef MAX_MEM_LEVEL
|
||||||
# ifdef MAXSEG_64K
|
# ifdef MAXSEG_64K
|
||||||
@ -96,13 +106,17 @@
|
|||||||
# endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Maximum value for windowBits in deflateInit2 and inflateInit2 */
|
/* Maximum value for windowBits in deflateInit2 and inflateInit2.
|
||||||
|
* WARNING: reducing MAX_WBITS makes minigzip unable to extract .gz files
|
||||||
|
* created by gzip. (Files created by minigzip can still be extracted by
|
||||||
|
* gzip.)
|
||||||
|
*/
|
||||||
#ifndef MAX_WBITS
|
#ifndef MAX_WBITS
|
||||||
# define MAX_WBITS 15 /* 32K LZ77 window */
|
# define MAX_WBITS 15 /* 32K LZ77 window */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* The memory requirements for deflate are (in bytes):
|
/* The memory requirements for deflate are (in bytes):
|
||||||
1 << (windowBits+2) + 1 << (memLevel+9)
|
(1 << (windowBits+2)) + (1 << (memLevel+9))
|
||||||
that is: 128K for windowBits=15 + 128K for memLevel = 8 (default values)
|
that is: 128K for windowBits=15 + 128K for memLevel = 8 (default values)
|
||||||
plus a few kilobytes for small objects. For example, if you want to reduce
|
plus a few kilobytes for small objects. For example, if you want to reduce
|
||||||
the default memory requirements from 256K to 128K, compile with
|
the default memory requirements from 256K to 128K, compile with
|
||||||
@ -134,7 +148,7 @@
|
|||||||
/* MSC small or medium model */
|
/* MSC small or medium model */
|
||||||
# define SMALL_MEDIUM
|
# define SMALL_MEDIUM
|
||||||
# ifdef _MSC_VER
|
# ifdef _MSC_VER
|
||||||
# define FAR __far
|
# define FAR _far
|
||||||
# else
|
# else
|
||||||
# define FAR far
|
# define FAR far
|
||||||
# endif
|
# endif
|
||||||
@ -142,19 +156,68 @@
|
|||||||
#if defined(__BORLANDC__) && (defined(__SMALL__) || defined(__MEDIUM__))
|
#if defined(__BORLANDC__) && (defined(__SMALL__) || defined(__MEDIUM__))
|
||||||
# ifndef __32BIT__
|
# ifndef __32BIT__
|
||||||
# define SMALL_MEDIUM
|
# define SMALL_MEDIUM
|
||||||
# define FAR __far
|
# define FAR _far
|
||||||
# endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* Compile with -DZLIB_DLL for Windows DLL support */
|
||||||
|
#if defined(ZLIB_DLL)
|
||||||
|
# if defined(_WINDOWS) || defined(WINDOWS)
|
||||||
|
# ifdef FAR
|
||||||
|
# undef FAR
|
||||||
|
# endif
|
||||||
|
# include <windows.h>
|
||||||
|
# define ZEXPORT WINAPI
|
||||||
|
# ifdef WIN32
|
||||||
|
# define ZEXPORTVA WINAPIV
|
||||||
|
# else
|
||||||
|
# define ZEXPORTVA FAR _cdecl _export
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
# if defined (__BORLANDC__)
|
||||||
|
# if (__BORLANDC__ >= 0x0500) && defined (WIN32)
|
||||||
|
# include <windows.h>
|
||||||
|
# define ZEXPORT __declspec(dllexport) WINAPI
|
||||||
|
# define ZEXPORTRVA __declspec(dllexport) WINAPIV
|
||||||
|
# else
|
||||||
|
# if defined (_Windows) && defined (__DLL__)
|
||||||
|
# define ZEXPORT _export
|
||||||
|
# define ZEXPORTVA _export
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined (__BEOS__)
|
||||||
|
# if defined (ZLIB_DLL)
|
||||||
|
# define ZEXTERN extern __declspec(dllexport)
|
||||||
|
# else
|
||||||
|
# define ZEXTERN extern __declspec(dllimport)
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef ZEXPORT
|
||||||
|
# define ZEXPORT
|
||||||
|
#endif
|
||||||
|
#ifndef ZEXPORTVA
|
||||||
|
# define ZEXPORTVA
|
||||||
|
#endif
|
||||||
|
#ifndef ZEXTERN
|
||||||
|
# define ZEXTERN extern
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifndef FAR
|
#ifndef FAR
|
||||||
# define FAR
|
# define FAR
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if !defined(MACOS) && !defined(TARGET_OS_MAC)
|
||||||
typedef unsigned char Byte; /* 8 bits */
|
typedef unsigned char Byte; /* 8 bits */
|
||||||
|
#endif
|
||||||
typedef unsigned int uInt; /* 16 bits or more */
|
typedef unsigned int uInt; /* 16 bits or more */
|
||||||
typedef unsigned long uLong; /* 32 bits or more */
|
typedef unsigned long uLong; /* 32 bits or more */
|
||||||
|
|
||||||
#if defined(__BORLANDC__) && defined(SMALL_MEDIUM)
|
#ifdef SMALL_MEDIUM
|
||||||
/* Borland C/C++ ignores FAR inside typedef */
|
/* Borland C/C++ and some old MSC versions ignore FAR inside typedef */
|
||||||
# define Bytef Byte FAR
|
# define Bytef Byte FAR
|
||||||
#else
|
#else
|
||||||
typedef Byte FAR Bytef;
|
typedef Byte FAR Bytef;
|
||||||
@ -172,19 +235,45 @@ typedef uLong FAR uLongf;
|
|||||||
typedef Byte *voidp;
|
typedef Byte *voidp;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef MOZILLA_CLIENT
|
#ifdef HAVE_UNISTD_H
|
||||||
#include "prtypes.h"
|
# include <sys/types.h> /* for off_t */
|
||||||
#else
|
# include <unistd.h> /* for SEEK_* and off_t */
|
||||||
/* Compile with -DZLIB_DLL for Windows DLL support */
|
# define z_off_t off_t
|
||||||
#if (defined(_WINDOWS) || defined(WINDOWS)) && defined(ZLIB_DLL)
|
#endif
|
||||||
# include <windows.h>
|
#ifndef SEEK_SET
|
||||||
# define EXPORT WINAPI
|
# define SEEK_SET 0 /* Seek from beginning of file. */
|
||||||
#else
|
# define SEEK_CUR 1 /* Seek from current position. */
|
||||||
# define EXPORT
|
# define SEEK_END 2 /* Set file pointer to EOF plus "offset" */
|
||||||
|
#endif
|
||||||
|
#ifndef z_off_t
|
||||||
|
# define z_off_t long
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define PR_PUBLIC_API(type) type
|
/* MVS linker does not support external names larger than 8 bytes */
|
||||||
|
#if defined(__MVS__)
|
||||||
#endif /* MOZILLA_CLIENT */
|
# pragma map(deflateInit_,"DEIN")
|
||||||
|
# pragma map(deflateInit2_,"DEIN2")
|
||||||
|
# pragma map(deflateEnd,"DEEND")
|
||||||
|
# pragma map(inflateInit_,"ININ")
|
||||||
|
# pragma map(inflateInit2_,"ININ2")
|
||||||
|
# pragma map(inflateEnd,"INEND")
|
||||||
|
# pragma map(inflateSync,"INSY")
|
||||||
|
# pragma map(inflateSetDictionary,"INSEDI")
|
||||||
|
# pragma map(inflate_blocks,"INBL")
|
||||||
|
# pragma map(inflate_blocks_new,"INBLNE")
|
||||||
|
# pragma map(inflate_blocks_free,"INBLFR")
|
||||||
|
# pragma map(inflate_blocks_reset,"INBLRE")
|
||||||
|
# pragma map(inflate_codes_free,"INCOFR")
|
||||||
|
# pragma map(inflate_codes,"INCO")
|
||||||
|
# pragma map(inflate_fast,"INFA")
|
||||||
|
# pragma map(inflate_flush,"INFLU")
|
||||||
|
# pragma map(inflate_mask,"INMA")
|
||||||
|
# pragma map(inflate_set_dictionary,"INSEDI2")
|
||||||
|
# pragma map(inflate_copyright,"INCOPY")
|
||||||
|
# pragma map(inflate_trees_bits,"INTRBI")
|
||||||
|
# pragma map(inflate_trees_dynamic,"INTRDY")
|
||||||
|
# pragma map(inflate_trees_fixed,"INTRFI")
|
||||||
|
# pragma map(inflate_trees_free,"INTRFR")
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif /* _ZCONF_H */
|
#endif /* _ZCONF_H */
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/* zlib.h -- interface of the 'zlib' general purpose compression library
|
/* zlib.h -- interface of the 'zlib' general purpose compression library
|
||||||
version 1.0.4, Jul 24th, 1996.
|
version 1.1.3, July 9th, 1998
|
||||||
|
|
||||||
Copyright (C) 1995-1996 Jean-loup Gailly and Mark Adler
|
Copyright (C) 1995-1998 Jean-loup Gailly and Mark Adler
|
||||||
|
|
||||||
This software is provided 'as-is', without any express or implied
|
This software is provided 'as-is', without any express or implied
|
||||||
warranty. In no event will the authors be held liable for any damages
|
warranty. In no event will the authors be held liable for any damages
|
||||||
@ -20,48 +20,44 @@
|
|||||||
3. This notice may not be removed or altered from any source distribution.
|
3. This notice may not be removed or altered from any source distribution.
|
||||||
|
|
||||||
Jean-loup Gailly Mark Adler
|
Jean-loup Gailly Mark Adler
|
||||||
gzip@prep.ai.mit.edu madler@alumni.caltech.edu
|
jloup@gzip.org madler@alumni.caltech.edu
|
||||||
|
|
||||||
|
|
||||||
The data format used by the zlib library is described by RFCs (Request for
|
The data format used by the zlib library is described by RFCs (Request for
|
||||||
Comments) 1950 to 1952 in the files ftp://ds.internic.net/rfc/rfc1950.txt
|
Comments) 1950 to 1952 in the files ftp://ds.internic.net/rfc/rfc1950.txt
|
||||||
(zlib format), rfc1951.txt (deflate format) and rfc1952.txt (gzip format).
|
(zlib format), rfc1951.txt (deflate format) and rfc1952.txt (gzip format).
|
||||||
*/
|
*/
|
||||||
/* This file was modified since it was taken from the zlib distribution */
|
|
||||||
|
|
||||||
#ifndef _ZLIB_H
|
#ifndef _ZLIB_H
|
||||||
#define _ZLIB_H
|
#define _ZLIB_H
|
||||||
|
|
||||||
|
#include "zconf.h"
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "zconf.h"
|
#define ZLIB_VERSION "1.1.3"
|
||||||
|
|
||||||
#define ZLIB_VERSION "1.0.4"
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
The 'zlib' compression library provides in-memory compression and
|
The 'zlib' compression library provides in-memory compression and
|
||||||
decompression functions, including integrity checks of the uncompressed
|
decompression functions, including integrity checks of the uncompressed
|
||||||
data. This version of the library supports only one compression method
|
data. This version of the library supports only one compression method
|
||||||
(deflation) but other algorithms may be added later and will have the same
|
(deflation) but other algorithms will be added later and will have the same
|
||||||
stream interface.
|
stream interface.
|
||||||
|
|
||||||
For compression the application must provide the output buffer and
|
|
||||||
may optionally provide the input buffer for optimization. For decompression,
|
|
||||||
the application must provide the input buffer and may optionally provide
|
|
||||||
the output buffer for optimization.
|
|
||||||
|
|
||||||
Compression can be done in a single step if the buffers are large
|
Compression can be done in a single step if the buffers are large
|
||||||
enough (for example if an input file is mmap'ed), or can be done by
|
enough (for example if an input file is mmap'ed), or can be done by
|
||||||
repeated calls of the compression function. In the latter case, the
|
repeated calls of the compression function. In the latter case, the
|
||||||
application must provide more input and/or consume the output
|
application must provide more input and/or consume the output
|
||||||
(providing more output space) before each call.
|
(providing more output space) before each call.
|
||||||
|
|
||||||
The library does not install any signal handler. It is recommended to
|
The library also supports reading and writing files in gzip (.gz) format
|
||||||
add at least a handler for SIGSEGV when decompressing; the library checks
|
with an interface similar to that of stdio.
|
||||||
the consistency of the input data whenever possible but may go nuts
|
|
||||||
for some forms of corrupted input.
|
The library does not install any signal handler. The decoder checks
|
||||||
|
the consistency of the compressed data, so the library should never
|
||||||
|
crash even in case of corrupted input.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
typedef voidpf (*alloc_func) OF((voidpf opaque, uInt items, uInt size));
|
typedef voidpf (*alloc_func) OF((voidpf opaque, uInt items, uInt size));
|
||||||
@ -105,6 +101,9 @@ typedef z_stream FAR *z_streamp;
|
|||||||
opaque value.
|
opaque value.
|
||||||
|
|
||||||
zalloc must return Z_NULL if there is not enough memory for the object.
|
zalloc must return Z_NULL if there is not enough memory for the object.
|
||||||
|
If zlib is used in a multi-threaded application, zalloc and zfree must be
|
||||||
|
thread safe.
|
||||||
|
|
||||||
On 16-bit systems, the functions zalloc and zfree must be able to allocate
|
On 16-bit systems, the functions zalloc and zfree must be able to allocate
|
||||||
exactly 65536 bytes, but will not be required to allocate more than this
|
exactly 65536 bytes, but will not be required to allocate more than this
|
||||||
if the symbol MAXSEG_64K is defined (see zconf.h). WARNING: On MSDOS,
|
if the symbol MAXSEG_64K is defined (see zconf.h). WARNING: On MSDOS,
|
||||||
@ -124,7 +123,7 @@ typedef z_stream FAR *z_streamp;
|
|||||||
/* constants */
|
/* constants */
|
||||||
|
|
||||||
#define Z_NO_FLUSH 0
|
#define Z_NO_FLUSH 0
|
||||||
#define Z_PARTIAL_FLUSH 1
|
#define Z_PARTIAL_FLUSH 1 /* will be removed, use Z_SYNC_FLUSH instead */
|
||||||
#define Z_SYNC_FLUSH 2
|
#define Z_SYNC_FLUSH 2
|
||||||
#define Z_FULL_FLUSH 3
|
#define Z_FULL_FLUSH 3
|
||||||
#define Z_FINISH 4
|
#define Z_FINISH 4
|
||||||
@ -169,11 +168,7 @@ typedef z_stream FAR *z_streamp;
|
|||||||
|
|
||||||
/* basic functions */
|
/* basic functions */
|
||||||
|
|
||||||
#ifdef MOZILLA_CLIENT
|
ZEXTERN const char * ZEXPORT zlibVersion OF((void));
|
||||||
PR_PUBLIC_API(extern const char *) zlibVersion (void);
|
|
||||||
#else
|
|
||||||
extern const char * EXPORT zlibVersion OF((void));
|
|
||||||
#endif
|
|
||||||
/* The application can compare zlibVersion and ZLIB_VERSION for consistency.
|
/* The application can compare zlibVersion and ZLIB_VERSION for consistency.
|
||||||
If the first character differs, the library code actually used is
|
If the first character differs, the library code actually used is
|
||||||
not compatible with the zlib.h header file used by the application.
|
not compatible with the zlib.h header file used by the application.
|
||||||
@ -181,7 +176,7 @@ extern const char * EXPORT zlibVersion OF((void));
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
extern int EXPORT deflateInit OF((z_streamp strm, int level));
|
ZEXTERN int ZEXPORT deflateInit OF((z_streamp strm, int level));
|
||||||
|
|
||||||
Initializes the internal stream state for compression. The fields
|
Initializes the internal stream state for compression. The fields
|
||||||
zalloc, zfree and opaque must be initialized before by the caller.
|
zalloc, zfree and opaque must be initialized before by the caller.
|
||||||
@ -203,13 +198,15 @@ extern int EXPORT deflateInit OF((z_streamp strm, int level));
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
#ifdef MOZILLA_CLIENT
|
ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush));
|
||||||
PR_PUBLIC_API(extern int) deflate (z_streamp strm, int flush);
|
|
||||||
#else
|
|
||||||
extern int EXPORT deflate OF((z_streamp strm, int flush));
|
|
||||||
#endif
|
|
||||||
/*
|
/*
|
||||||
Performs one or both of the following actions:
|
deflate compresses as much data as possible, and stops when the input
|
||||||
|
buffer becomes empty or the output buffer becomes full. It may introduce some
|
||||||
|
output latency (reading input without producing any output) except when
|
||||||
|
forced to flush.
|
||||||
|
|
||||||
|
The detailed semantics are as follows. deflate performs one or both of the
|
||||||
|
following actions:
|
||||||
|
|
||||||
- Compress more input starting at next_in and update next_in and avail_in
|
- Compress more input starting at next_in and update next_in and avail_in
|
||||||
accordingly. If not all input can be processed (because there is not
|
accordingly. If not all input can be processed (because there is not
|
||||||
@ -231,24 +228,23 @@ extern int EXPORT deflate OF((z_streamp strm, int flush));
|
|||||||
and with zero avail_out, it must be called again after making room in the
|
and with zero avail_out, it must be called again after making room in the
|
||||||
output buffer because there might be more output pending.
|
output buffer because there might be more output pending.
|
||||||
|
|
||||||
If the parameter flush is set to Z_PARTIAL_FLUSH, the current compression
|
If the parameter flush is set to Z_SYNC_FLUSH, all pending output is
|
||||||
block is terminated and flushed to the output buffer so that the
|
flushed to the output buffer and the output is aligned on a byte boundary, so
|
||||||
decompressor can get all input data available so far. For method 9, a future
|
that the decompressor can get all input data available so far. (In particular
|
||||||
variant on method 8, the current block will be flushed but not terminated.
|
avail_in is zero after the call if enough output space has been provided
|
||||||
Z_SYNC_FLUSH has the same effect as partial flush except that the compressed
|
before the call.) Flushing may degrade compression for some compression
|
||||||
output is byte aligned (the compressor can clear its internal bit buffer)
|
algorithms and so it should be used only when necessary.
|
||||||
and the current block is always terminated; this can be useful if the
|
|
||||||
compressor has to be restarted from scratch after an interruption (in which
|
If flush is set to Z_FULL_FLUSH, all output is flushed as with
|
||||||
case the internal state of the compressor may be lost).
|
Z_SYNC_FLUSH, and the compression state is reset so that decompression can
|
||||||
If flush is set to Z_FULL_FLUSH, the compression block is terminated, a
|
restart from this point if previous compressed data has been damaged or if
|
||||||
special marker is output and the compression dictionary is discarded; this
|
random access is desired. Using Z_FULL_FLUSH too often can seriously degrade
|
||||||
is useful to allow the decompressor to synchronize if one compressed block
|
the compression.
|
||||||
has been damaged (see inflateSync below). Flushing degrades compression and
|
|
||||||
so should be used only when necessary. Using Z_FULL_FLUSH too often can
|
If deflate returns with avail_out == 0, this function must be called again
|
||||||
seriously degrade the compression. If deflate returns with avail_out == 0,
|
with the same value of the flush parameter and more output space (updated
|
||||||
this function must be called again with the same value of the flush
|
avail_out), until the flush is complete (deflate returns with non-zero
|
||||||
parameter and more output space (updated avail_out), until the flush is
|
avail_out).
|
||||||
complete (deflate returns with non-zero avail_out).
|
|
||||||
|
|
||||||
If the parameter flush is set to Z_FINISH, pending input is processed,
|
If the parameter flush is set to Z_FINISH, pending input is processed,
|
||||||
pending output is flushed and deflate returns with Z_STREAM_END if there
|
pending output is flushed and deflate returns with Z_STREAM_END if there
|
||||||
@ -263,6 +259,9 @@ extern int EXPORT deflate OF((z_streamp strm, int flush));
|
|||||||
0.1% larger than avail_in plus 12 bytes. If deflate does not return
|
0.1% larger than avail_in plus 12 bytes. If deflate does not return
|
||||||
Z_STREAM_END, then it must be called again as described above.
|
Z_STREAM_END, then it must be called again as described above.
|
||||||
|
|
||||||
|
deflate() sets strm->adler to the adler32 checksum of all input read
|
||||||
|
so far (that is, total_in bytes).
|
||||||
|
|
||||||
deflate() may update data_type if it can make a good guess about
|
deflate() may update data_type if it can make a good guess about
|
||||||
the input data type (Z_ASCII or Z_BINARY). In doubt, the data is considered
|
the input data type (Z_ASCII or Z_BINARY). In doubt, the data is considered
|
||||||
binary. This field is only for information purposes and does not affect
|
binary. This field is only for information purposes and does not affect
|
||||||
@ -272,15 +271,12 @@ extern int EXPORT deflate OF((z_streamp strm, int flush));
|
|||||||
processed or more output produced), Z_STREAM_END if all input has been
|
processed or more output produced), Z_STREAM_END if all input has been
|
||||||
consumed and all output has been produced (only when flush is set to
|
consumed and all output has been produced (only when flush is set to
|
||||||
Z_FINISH), Z_STREAM_ERROR if the stream state was inconsistent (for example
|
Z_FINISH), Z_STREAM_ERROR if the stream state was inconsistent (for example
|
||||||
if next_in or next_out was NULL), Z_BUF_ERROR if no progress is possible.
|
if next_in or next_out was NULL), Z_BUF_ERROR if no progress is possible
|
||||||
|
(for example avail_in or avail_out was zero).
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
#ifdef MOZILLA_CLIENT
|
ZEXTERN int ZEXPORT deflateEnd OF((z_streamp strm));
|
||||||
PR_PUBLIC_API(extern int) deflateEnd (z_streamp strm);
|
|
||||||
#else
|
|
||||||
extern int EXPORT deflateEnd OF((z_streamp strm));
|
|
||||||
#endif
|
|
||||||
/*
|
/*
|
||||||
All dynamically allocated data structures for this stream are freed.
|
All dynamically allocated data structures for this stream are freed.
|
||||||
This function discards any unprocessed input and does not flush any
|
This function discards any unprocessed input and does not flush any
|
||||||
@ -295,28 +291,35 @@ extern int EXPORT deflateEnd OF((z_streamp strm));
|
|||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
extern int EXPORT inflateInit OF((z_streamp strm));
|
ZEXTERN int ZEXPORT inflateInit OF((z_streamp strm));
|
||||||
|
|
||||||
Initializes the internal stream state for decompression. The fields
|
Initializes the internal stream state for decompression. The fields
|
||||||
zalloc, zfree and opaque must be initialized before by the caller. If
|
next_in, avail_in, zalloc, zfree and opaque must be initialized before by
|
||||||
zalloc and zfree are set to Z_NULL, inflateInit updates them to use default
|
the caller. If next_in is not Z_NULL and avail_in is large enough (the exact
|
||||||
allocation functions.
|
value depends on the compression method), inflateInit determines the
|
||||||
|
compression method from the zlib header and allocates all data structures
|
||||||
|
accordingly; otherwise the allocation will be deferred to the first call of
|
||||||
|
inflate. If zalloc and zfree are set to Z_NULL, inflateInit updates them to
|
||||||
|
use default allocation functions.
|
||||||
|
|
||||||
inflateInit returns Z_OK if success, Z_MEM_ERROR if there was not
|
inflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough
|
||||||
enough memory, Z_VERSION_ERROR if the zlib library version is incompatible
|
memory, Z_VERSION_ERROR if the zlib library version is incompatible with the
|
||||||
with the version assumed by the caller. msg is set to null if there is no
|
version assumed by the caller. msg is set to null if there is no error
|
||||||
error message. inflateInit does not perform any decompression: this will be
|
message. inflateInit does not perform any decompression apart from reading
|
||||||
done by inflate().
|
the zlib header if present: this will be done by inflate(). (So next_in and
|
||||||
|
avail_in may be modified, but next_out and avail_out are unchanged.)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
#ifdef MOZILLA_CLIENT
|
ZEXTERN int ZEXPORT inflate OF((z_streamp strm, int flush));
|
||||||
PR_PUBLIC_API(extern int) inflate (z_streamp strm, int flush);
|
|
||||||
#else
|
|
||||||
extern int EXPORT inflate OF((z_streamp strm, int flush));
|
|
||||||
#endif
|
|
||||||
/*
|
/*
|
||||||
Performs one or both of the following actions:
|
inflate decompresses as much data as possible, and stops when the input
|
||||||
|
buffer becomes empty or the output buffer becomes full. It may some
|
||||||
|
introduce some output latency (reading input without producing any output)
|
||||||
|
except when forced to flush.
|
||||||
|
|
||||||
|
The detailed semantics are as follows. inflate performs one or both of the
|
||||||
|
following actions:
|
||||||
|
|
||||||
- Decompress more input starting at next_in and update next_in and avail_in
|
- Decompress more input starting at next_in and update next_in and avail_in
|
||||||
accordingly. If not all input can be processed (because there is not
|
accordingly. If not all input can be processed (because there is not
|
||||||
@ -337,9 +340,9 @@ extern int EXPORT inflate OF((z_streamp strm, int flush));
|
|||||||
must be called again after making room in the output buffer because there
|
must be called again after making room in the output buffer because there
|
||||||
might be more output pending.
|
might be more output pending.
|
||||||
|
|
||||||
If the parameter flush is set to Z_PARTIAL_FLUSH, inflate flushes as much
|
If the parameter flush is set to Z_SYNC_FLUSH, inflate flushes as much
|
||||||
output as possible to the output buffer. The flushing behavior of inflate is
|
output as possible to the output buffer. The flushing behavior of inflate is
|
||||||
not specified for values of the flush parameter other than Z_PARTIAL_FLUSH
|
not specified for values of the flush parameter other than Z_SYNC_FLUSH
|
||||||
and Z_FINISH, but the current implementation actually flushes as much output
|
and Z_FINISH, but the current implementation actually flushes as much output
|
||||||
as possible anyway.
|
as possible anyway.
|
||||||
|
|
||||||
@ -354,26 +357,30 @@ extern int EXPORT inflate OF((z_streamp strm, int flush));
|
|||||||
is never required, but can be used to inform inflate that a faster routine
|
is never required, but can be used to inform inflate that a faster routine
|
||||||
may be used for the single inflate() call.
|
may be used for the single inflate() call.
|
||||||
|
|
||||||
inflate() returns Z_OK if some progress has been made (more input
|
If a preset dictionary is needed at this point (see inflateSetDictionary
|
||||||
processed or more output produced), Z_STREAM_END if the end of the
|
below), inflate sets strm-adler to the adler32 checksum of the
|
||||||
compressed data has been reached and all uncompressed output has been
|
dictionary chosen by the compressor and returns Z_NEED_DICT; otherwise
|
||||||
produced, Z_NEED_DICT if a preset dictionary is needed at this point (see
|
it sets strm->adler to the adler32 checksum of all output produced
|
||||||
inflateSetDictionary below), Z_DATA_ERROR if the input data was corrupted,
|
so far (that is, total_out bytes) and returns Z_OK, Z_STREAM_END or
|
||||||
Z_STREAM_ERROR if the stream structure was inconsistent (for example if
|
an error code as described below. At the end of the stream, inflate()
|
||||||
next_in or next_out was NULL), Z_MEM_ERROR if there was not enough memory,
|
checks that its computed adler32 checksum is equal to that saved by the
|
||||||
Z_BUF_ERROR if no progress is possible or if there was not enough room in
|
compressor and returns Z_STREAM_END only if the checksum is correct.
|
||||||
the output buffer when Z_FINISH is used. In the Z_DATA_ERROR case, the
|
|
||||||
application may then call inflateSync to look for a good compression block.
|
inflate() returns Z_OK if some progress has been made (more input processed
|
||||||
In the Z_NEED_DICT case, strm->adler is set to the Adler32 value of the
|
or more output produced), Z_STREAM_END if the end of the compressed data has
|
||||||
dictionary chosen by the compressor.
|
been reached and all uncompressed output has been produced, Z_NEED_DICT if a
|
||||||
|
preset dictionary is needed at this point, Z_DATA_ERROR if the input data was
|
||||||
|
corrupted (input stream not conforming to the zlib format or incorrect
|
||||||
|
adler32 checksum), Z_STREAM_ERROR if the stream structure was inconsistent
|
||||||
|
(for example if next_in or next_out was NULL), Z_MEM_ERROR if there was not
|
||||||
|
enough memory, Z_BUF_ERROR if no progress is possible or if there was not
|
||||||
|
enough room in the output buffer when Z_FINISH is used. In the Z_DATA_ERROR
|
||||||
|
case, the application may then call inflateSync to look for a good
|
||||||
|
compression block.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
#ifdef MOZILLA_CLIENT
|
ZEXTERN int ZEXPORT inflateEnd OF((z_streamp strm));
|
||||||
PR_PUBLIC_API(extern int) inflateEnd (z_streamp strm);
|
|
||||||
#else
|
|
||||||
extern int EXPORT inflateEnd OF((z_streamp strm));
|
|
||||||
#endif
|
|
||||||
/*
|
/*
|
||||||
All dynamically allocated data structures for this stream are freed.
|
All dynamically allocated data structures for this stream are freed.
|
||||||
This function discards any unprocessed input and does not flush any
|
This function discards any unprocessed input and does not flush any
|
||||||
@ -391,26 +398,25 @@ extern int EXPORT inflateEnd OF((z_streamp strm));
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
extern int EXPORT deflateInit2 OF((z_streamp strm,
|
ZEXTERN int ZEXPORT deflateInit2 OF((z_streamp strm,
|
||||||
int level,
|
int level,
|
||||||
int method,
|
int method,
|
||||||
int windowBits,
|
int windowBits,
|
||||||
int memLevel,
|
int memLevel,
|
||||||
int strategy));
|
int strategy));
|
||||||
|
|
||||||
This is another version of deflateInit with more compression options. The
|
This is another version of deflateInit with more compression options. The
|
||||||
fields next_in, zalloc, zfree and opaque must be initialized before by
|
fields next_in, zalloc, zfree and opaque must be initialized before by
|
||||||
the caller.
|
the caller.
|
||||||
|
|
||||||
The method parameter is the compression method. It must be Z_DEFLATED in
|
The method parameter is the compression method. It must be Z_DEFLATED in
|
||||||
this version of the library. (Method 9 will allow a 64K history buffer and
|
this version of the library.
|
||||||
partial block flushes.)
|
|
||||||
|
|
||||||
The windowBits parameter is the base two logarithm of the window size
|
The windowBits parameter is the base two logarithm of the window size
|
||||||
(the size of the history buffer). It should be in the range 8..15 for this
|
(the size of the history buffer). It should be in the range 8..15 for this
|
||||||
version of the library (the value 16 will be allowed for method 9). Larger
|
version of the library. Larger values of this parameter result in better
|
||||||
values of this parameter result in better compression at the expense of
|
compression at the expense of memory usage. The default value is 15 if
|
||||||
memory usage. The default value is 15 if deflateInit is used instead.
|
deflateInit is used instead.
|
||||||
|
|
||||||
The memLevel parameter specifies how much memory should be allocated
|
The memLevel parameter specifies how much memory should be allocated
|
||||||
for the internal compression state. memLevel=1 uses minimum memory but
|
for the internal compression state. memLevel=1 uses minimum memory but
|
||||||
@ -429,48 +435,35 @@ extern int EXPORT deflateInit2 OF((z_streamp strm,
|
|||||||
the compression ratio but not the correctness of the compressed output even
|
the compression ratio but not the correctness of the compressed output even
|
||||||
if it is not set appropriately.
|
if it is not set appropriately.
|
||||||
|
|
||||||
If next_in is not null, the library will use this buffer to hold also
|
deflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough
|
||||||
some history information; the buffer must either hold the entire input
|
memory, Z_STREAM_ERROR if a parameter is invalid (such as an invalid
|
||||||
data, or have at least 1<<(windowBits+1) bytes and be writable. If next_in
|
method). msg is set to null if there is no error message. deflateInit2 does
|
||||||
is null, the library will allocate its own history buffer (and leave next_in
|
not perform any compression: this will be done by deflate().
|
||||||
null). next_out need not be provided here but must be provided by the
|
|
||||||
application for the next call of deflate().
|
|
||||||
|
|
||||||
If the history buffer is provided by the application, next_in must
|
|
||||||
must never be changed by the application since the compressor maintains
|
|
||||||
information inside this buffer from call to call; the application
|
|
||||||
must provide more input only by increasing avail_in. next_in is always
|
|
||||||
reset by the library in this case.
|
|
||||||
|
|
||||||
deflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was
|
|
||||||
not enough memory, Z_STREAM_ERROR if a parameter is invalid (such as
|
|
||||||
an invalid method). msg is set to null if there is no error message.
|
|
||||||
deflateInit2 does not perform any compression: this will be done by
|
|
||||||
deflate().
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifdef MOZILLA_CLIENT
|
ZEXTERN int ZEXPORT deflateSetDictionary OF((z_streamp strm,
|
||||||
PR_PUBLIC_API(extern int) deflateSetDictionary (z_streamp strm,
|
const Bytef *dictionary,
|
||||||
const Bytef *dictionary,
|
uInt dictLength));
|
||||||
uInt dictLength);
|
|
||||||
#else
|
|
||||||
extern int EXPORT deflateSetDictionary OF((z_streamp strm,
|
|
||||||
const Bytef *dictionary,
|
|
||||||
uInt dictLength));
|
|
||||||
#endif
|
|
||||||
/*
|
/*
|
||||||
Initializes the compression dictionary (history buffer) from the given
|
Initializes the compression dictionary from the given byte sequence
|
||||||
byte sequence without producing any compressed output. This function must
|
without producing any compressed output. This function must be called
|
||||||
be called immediately after deflateInit or deflateInit2, before any call
|
immediately after deflateInit, deflateInit2 or deflateReset, before any
|
||||||
of deflate. The compressor and decompressor must use exactly the same
|
call of deflate. The compressor and decompressor must use exactly the same
|
||||||
dictionary (see inflateSetDictionary).
|
dictionary (see inflateSetDictionary).
|
||||||
|
|
||||||
The dictionary should consist of strings (byte sequences) that are likely
|
The dictionary should consist of strings (byte sequences) that are likely
|
||||||
to be encountered later in the data to be compressed, with the most commonly
|
to be encountered later in the data to be compressed, with the most commonly
|
||||||
used strings preferably put towards the end of the dictionary. Using a
|
used strings preferably put towards the end of the dictionary. Using a
|
||||||
dictionary is most useful when the data to be compressed is short and
|
dictionary is most useful when the data to be compressed is short and can be
|
||||||
can be predicted with good accuracy; the data can then be compressed better
|
predicted with good accuracy; the data can then be compressed better than
|
||||||
than with the default empty dictionary. In this version of the library,
|
with the default empty dictionary.
|
||||||
only the last 32K bytes of the dictionary are used.
|
|
||||||
|
Depending on the size of the compression data structures selected by
|
||||||
|
deflateInit or deflateInit2, a part of the dictionary may in effect be
|
||||||
|
discarded, for example if the dictionary is larger than the window size in
|
||||||
|
deflate or deflate2. Thus the strings most likely to be useful should be
|
||||||
|
put at the end of the dictionary, not at the front.
|
||||||
|
|
||||||
Upon return of this function, strm->adler is set to the Adler32 value
|
Upon return of this function, strm->adler is set to the Adler32 value
|
||||||
of the dictionary; the decompressor may later use this value to determine
|
of the dictionary; the decompressor may later use this value to determine
|
||||||
which dictionary has been used by the compressor. (The Adler32 value
|
which dictionary has been used by the compressor. (The Adler32 value
|
||||||
@ -478,24 +471,16 @@ extern int EXPORT deflateSetDictionary OF((z_streamp strm,
|
|||||||
actually used by the compressor.)
|
actually used by the compressor.)
|
||||||
|
|
||||||
deflateSetDictionary returns Z_OK if success, or Z_STREAM_ERROR if a
|
deflateSetDictionary returns Z_OK if success, or Z_STREAM_ERROR if a
|
||||||
parameter is invalid (such as NULL dictionary) or the stream state
|
parameter is invalid (such as NULL dictionary) or the stream state is
|
||||||
is inconsistent (for example if deflate has already been called for this
|
inconsistent (for example if deflate has already been called for this stream
|
||||||
stream). deflateSetDictionary does not perform any compression: this will
|
or if the compression method is bsort). deflateSetDictionary does not
|
||||||
be done by deflate().
|
perform any compression: this will be done by deflate().
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifdef MOZILLA_CLIENT
|
ZEXTERN int ZEXPORT deflateCopy OF((z_streamp dest,
|
||||||
PR_PUBLIC_API(extern int) deflateCopy (z_streamp dest, z_streamp source);
|
z_streamp source));
|
||||||
#else
|
|
||||||
extern int EXPORT deflateCopy OF((z_streamp dest, z_streamp source));
|
|
||||||
#endif
|
|
||||||
/*
|
/*
|
||||||
Sets the destination stream as a complete copy of the source stream. If
|
Sets the destination stream as a complete copy of the source stream.
|
||||||
the source stream is using an application-supplied history buffer, a new
|
|
||||||
buffer is allocated for the destination stream. The compressed output
|
|
||||||
buffer is always application-supplied. It's the responsibility of the
|
|
||||||
application to provide the correct values of next_out and avail_out for the
|
|
||||||
next call of deflate.
|
|
||||||
|
|
||||||
This function can be useful when several compression strategies will be
|
This function can be useful when several compression strategies will be
|
||||||
tried, for example when there are several ways of pre-processing the input
|
tried, for example when there are several ways of pre-processing the input
|
||||||
@ -510,11 +495,7 @@ extern int EXPORT deflateCopy OF((z_streamp dest, z_streamp source));
|
|||||||
destination.
|
destination.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifdef MOZILLA_CLIENT
|
ZEXTERN int ZEXPORT deflateReset OF((z_streamp strm));
|
||||||
PR_PUBLIC_API(extern int) deflateReset (z_streamp strm);
|
|
||||||
#else
|
|
||||||
extern int EXPORT deflateReset OF((z_streamp strm));
|
|
||||||
#endif
|
|
||||||
/*
|
/*
|
||||||
This function is equivalent to deflateEnd followed by deflateInit,
|
This function is equivalent to deflateEnd followed by deflateInit,
|
||||||
but does not free and reallocate all the internal compression state.
|
but does not free and reallocate all the internal compression state.
|
||||||
@ -525,18 +506,17 @@ extern int EXPORT deflateReset OF((z_streamp strm));
|
|||||||
stream state was inconsistent (such as zalloc or state being NULL).
|
stream state was inconsistent (such as zalloc or state being NULL).
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifdef MOZILLA_CLIENT
|
ZEXTERN int ZEXPORT deflateParams OF((z_streamp strm,
|
||||||
PR_PUBLIC_API(extern int) deflateParams (z_streamp strm, int level, int strategy);
|
int level,
|
||||||
#else
|
int strategy));
|
||||||
extern int EXPORT deflateParams OF((z_streamp strm, int level, int strategy));
|
|
||||||
#endif
|
|
||||||
/*
|
/*
|
||||||
Dynamically update the compression level and compression strategy.
|
Dynamically update the compression level and compression strategy. The
|
||||||
This can be used to switch between compression and straight copy of
|
interpretation of level and strategy is as in deflateInit2. This can be
|
||||||
the input data, or to switch to a different kind of input data requiring
|
used to switch between compression and straight copy of the input data, or
|
||||||
a different strategy. If the compression level is changed, the input
|
to switch to a different kind of input data requiring a different
|
||||||
available so far is compressed with the old level (and may be flushed);
|
strategy. If the compression level is changed, the input available so far
|
||||||
the new level will take effect only at the next call of deflate().
|
is compressed with the old level (and may be flushed); the new level will
|
||||||
|
take effect only at the next call of deflate().
|
||||||
|
|
||||||
Before the call of deflateParams, the stream state must be set as for
|
Before the call of deflateParams, the stream state must be set as for
|
||||||
a call of deflate(), since the currently available input may have to
|
a call of deflate(), since the currently available input may have to
|
||||||
@ -548,55 +528,37 @@ extern int EXPORT deflateParams OF((z_streamp strm, int level, int strategy));
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
extern int EXPORT inflateInit2 OF((z_streamp strm,
|
ZEXTERN int ZEXPORT inflateInit2 OF((z_streamp strm,
|
||||||
int windowBits));
|
int windowBits));
|
||||||
|
|
||||||
This is another version of inflateInit with more compression options. The
|
This is another version of inflateInit with an extra parameter. The
|
||||||
fields next_out, zalloc, zfree and opaque must be initialized before by
|
fields next_in, avail_in, zalloc, zfree and opaque must be initialized
|
||||||
the caller.
|
before by the caller.
|
||||||
|
|
||||||
The windowBits parameter is the base two logarithm of the maximum window
|
The windowBits parameter is the base two logarithm of the maximum window
|
||||||
size (the size of the history buffer). It should be in the range 8..15 for
|
size (the size of the history buffer). It should be in the range 8..15 for
|
||||||
this version of the library (the value 16 will be allowed soon). The
|
this version of the library. The default value is 15 if inflateInit is used
|
||||||
default value is 15 if inflateInit is used instead. If a compressed stream
|
instead. If a compressed stream with a larger window size is given as
|
||||||
with a larger window size is given as input, inflate() will return with
|
input, inflate() will return with the error code Z_DATA_ERROR instead of
|
||||||
the error code Z_DATA_ERROR instead of trying to allocate a larger window.
|
trying to allocate a larger window.
|
||||||
|
|
||||||
If next_out is not null, the library will use this buffer for the history
|
inflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough
|
||||||
buffer; the buffer must either be large enough to hold the entire output
|
memory, Z_STREAM_ERROR if a parameter is invalid (such as a negative
|
||||||
data, or have at least 1<<windowBits bytes. If next_out is null, the
|
memLevel). msg is set to null if there is no error message. inflateInit2
|
||||||
library will allocate its own buffer (and leave next_out null). next_in
|
does not perform any decompression apart from reading the zlib header if
|
||||||
need not be provided here but must be provided by the application for the
|
present: this will be done by inflate(). (So next_in and avail_in may be
|
||||||
next call of inflate().
|
modified, but next_out and avail_out are unchanged.)
|
||||||
|
|
||||||
If the history buffer is provided by the application, next_out must
|
|
||||||
never be changed by the application since the decompressor maintains
|
|
||||||
history information inside this buffer from call to call; the application
|
|
||||||
can only reset next_out to the beginning of the history buffer when
|
|
||||||
avail_out is zero and all output has been consumed.
|
|
||||||
|
|
||||||
inflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was
|
|
||||||
not enough memory, Z_STREAM_ERROR if a parameter is invalid (such as
|
|
||||||
windowBits < 8). msg is set to null if there is no error message.
|
|
||||||
inflateInit2 does not perform any decompression: this will be done by
|
|
||||||
inflate().
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifdef MOZILLA_CLIENT
|
ZEXTERN int ZEXPORT inflateSetDictionary OF((z_streamp strm,
|
||||||
PR_PUBLIC_API(extern int) inflateSetDictionary (z_streamp strm,
|
const Bytef *dictionary,
|
||||||
const Bytef *dictionary,
|
uInt dictLength));
|
||||||
uInt dictLength);
|
|
||||||
#else
|
|
||||||
extern int EXPORT inflateSetDictionary OF((z_streamp strm,
|
|
||||||
const Bytef *dictionary,
|
|
||||||
uInt dictLength));
|
|
||||||
#endif
|
|
||||||
/*
|
/*
|
||||||
Initializes the decompression dictionary (history buffer) from the given
|
Initializes the decompression dictionary from the given uncompressed byte
|
||||||
uncompressed byte sequence. This function must be called immediately after
|
sequence. This function must be called immediately after a call of inflate
|
||||||
a call of inflate if this call returned Z_NEED_DICT. The dictionary chosen
|
if this call returned Z_NEED_DICT. The dictionary chosen by the compressor
|
||||||
by the compressor can be determined from the Adler32 value returned by this
|
can be determined from the Adler32 value returned by this call of
|
||||||
call of inflate. The compressor and decompressor must use exactly the same
|
inflate. The compressor and decompressor must use exactly the same
|
||||||
dictionary (see deflateSetDictionary).
|
dictionary (see deflateSetDictionary).
|
||||||
|
|
||||||
inflateSetDictionary returns Z_OK if success, Z_STREAM_ERROR if a
|
inflateSetDictionary returns Z_OK if success, Z_STREAM_ERROR if a
|
||||||
@ -607,18 +569,14 @@ extern int EXPORT inflateSetDictionary OF((z_streamp strm,
|
|||||||
inflate().
|
inflate().
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifdef MOZILLA_CLIENT
|
ZEXTERN int ZEXPORT inflateSync OF((z_streamp strm));
|
||||||
PR_PUBLIC_API(extern int) inflateSync (z_streamp strm);
|
|
||||||
#else
|
|
||||||
extern int EXPORT inflateSync OF((z_streamp strm));
|
|
||||||
#endif
|
|
||||||
/*
|
/*
|
||||||
Skips invalid compressed data until the special marker (see deflate()
|
Skips invalid compressed data until a full flush point (see above the
|
||||||
above) can be found, or until all available input is skipped. No output
|
description of deflate with Z_FULL_FLUSH) can be found, or until all
|
||||||
is provided.
|
available input is skipped. No output is provided.
|
||||||
|
|
||||||
inflateSync returns Z_OK if the special marker has been found, Z_BUF_ERROR
|
inflateSync returns Z_OK if a full flush point has been found, Z_BUF_ERROR
|
||||||
if no more input was provided, Z_DATA_ERROR if no marker has been found,
|
if no more input was provided, Z_DATA_ERROR if no flush point has been found,
|
||||||
or Z_STREAM_ERROR if the stream structure was inconsistent. In the success
|
or Z_STREAM_ERROR if the stream structure was inconsistent. In the success
|
||||||
case, the application may save the current current value of total_in which
|
case, the application may save the current current value of total_in which
|
||||||
indicates where valid compressed data was found. In the error case, the
|
indicates where valid compressed data was found. In the error case, the
|
||||||
@ -626,11 +584,7 @@ extern int EXPORT inflateSync OF((z_streamp strm));
|
|||||||
until success or end of the input data.
|
until success or end of the input data.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifdef MOZILLA_CLIENT
|
ZEXTERN int ZEXPORT inflateReset OF((z_streamp strm));
|
||||||
PR_PUBLIC_API(extern int) inflateReset (z_streamp strm);
|
|
||||||
#else
|
|
||||||
extern int EXPORT inflateReset OF((z_streamp strm));
|
|
||||||
#endif
|
|
||||||
/*
|
/*
|
||||||
This function is equivalent to inflateEnd followed by inflateInit,
|
This function is equivalent to inflateEnd followed by inflateInit,
|
||||||
but does not free and reallocate all the internal decompression state.
|
but does not free and reallocate all the internal decompression state.
|
||||||
@ -646,18 +600,13 @@ extern int EXPORT inflateReset OF((z_streamp strm));
|
|||||||
/*
|
/*
|
||||||
The following utility functions are implemented on top of the
|
The following utility functions are implemented on top of the
|
||||||
basic stream-oriented functions. To simplify the interface, some
|
basic stream-oriented functions. To simplify the interface, some
|
||||||
default options are assumed (compression level, window size,
|
default options are assumed (compression level and memory usage,
|
||||||
standard memory allocation functions). The source code of these
|
standard memory allocation functions). The source code of these
|
||||||
utility functions can easily be modified if you need special options.
|
utility functions can easily be modified if you need special options.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifdef MOZILLA_CLIENT
|
ZEXTERN int ZEXPORT compress OF((Bytef *dest, uLongf *destLen,
|
||||||
PR_PUBLIC_API(extern int) compress (Bytef *dest, uLongf *destLen,
|
const Bytef *source, uLong sourceLen));
|
||||||
const Bytef *source, uLong sourceLen);
|
|
||||||
#else
|
|
||||||
extern int EXPORT compress OF((Bytef *dest, uLongf *destLen,
|
|
||||||
const Bytef *source, uLong sourceLen));
|
|
||||||
#endif
|
|
||||||
/*
|
/*
|
||||||
Compresses the source buffer into the destination buffer. sourceLen is
|
Compresses the source buffer into the destination buffer. sourceLen is
|
||||||
the byte length of the source buffer. Upon entry, destLen is the total
|
the byte length of the source buffer. Upon entry, destLen is the total
|
||||||
@ -671,13 +620,23 @@ extern int EXPORT compress OF((Bytef *dest, uLongf *destLen,
|
|||||||
buffer.
|
buffer.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifdef MOZILLA_CLIENT
|
ZEXTERN int ZEXPORT compress2 OF((Bytef *dest, uLongf *destLen,
|
||||||
PR_PUBLIC_API(extern int) uncompress (Bytef *dest, uLongf *destLen,
|
const Bytef *source, uLong sourceLen,
|
||||||
const Bytef *source, uLong sourceLen);
|
int level));
|
||||||
#else
|
/*
|
||||||
extern int EXPORT uncompress OF((Bytef *dest, uLongf *destLen,
|
Compresses the source buffer into the destination buffer. The level
|
||||||
const Bytef *source, uLong sourceLen));
|
parameter has the same meaning as in deflateInit. sourceLen is the byte
|
||||||
#endif
|
length of the source buffer. Upon entry, destLen is the total size of the
|
||||||
|
destination buffer, which must be at least 0.1% larger than sourceLen plus
|
||||||
|
12 bytes. Upon exit, destLen is the actual size of the compressed buffer.
|
||||||
|
|
||||||
|
compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough
|
||||||
|
memory, Z_BUF_ERROR if there was not enough room in the output buffer,
|
||||||
|
Z_STREAM_ERROR if the level parameter is invalid.
|
||||||
|
*/
|
||||||
|
|
||||||
|
ZEXTERN int ZEXPORT uncompress OF((Bytef *dest, uLongf *destLen,
|
||||||
|
const Bytef *source, uLong sourceLen));
|
||||||
/*
|
/*
|
||||||
Decompresses the source buffer into the destination buffer. sourceLen is
|
Decompresses the source buffer into the destination buffer. sourceLen is
|
||||||
the byte length of the source buffer. Upon entry, destLen is the total
|
the byte length of the source buffer. Upon entry, destLen is the total
|
||||||
@ -697,27 +656,23 @@ extern int EXPORT uncompress OF((Bytef *dest, uLongf *destLen,
|
|||||||
|
|
||||||
typedef voidp gzFile;
|
typedef voidp gzFile;
|
||||||
|
|
||||||
#ifdef MOZILLA_CLIENT
|
ZEXTERN gzFile ZEXPORT gzopen OF((const char *path, const char *mode));
|
||||||
PR_PUBLIC_API(extern gzFile) gzopen (const char *path, const char *mode);
|
|
||||||
#else
|
|
||||||
extern gzFile EXPORT gzopen OF((const char *path, const char *mode));
|
|
||||||
#endif
|
|
||||||
/*
|
/*
|
||||||
Opens a gzip (.gz) file for reading or writing. The mode parameter
|
Opens a gzip (.gz) file for reading or writing. The mode parameter
|
||||||
is as in fopen ("rb" or "wb") but can also include a compression level
|
is as in fopen ("rb" or "wb") but can also include a compression level
|
||||||
("wb9"). gzopen can be used to read a file which is not in gzip format;
|
("wb9") or a strategy: 'f' for filtered data as in "wb6f", 'h' for
|
||||||
in this case gzread will directly read from the file without decompression.
|
Huffman only compression as in "wb1h". (See the description
|
||||||
|
of deflateInit2 for more information about the strategy parameter.)
|
||||||
|
|
||||||
|
gzopen can be used to read a file which is not in gzip format; in this
|
||||||
|
case gzread will directly read from the file without decompression.
|
||||||
|
|
||||||
gzopen returns NULL if the file could not be opened or if there was
|
gzopen returns NULL if the file could not be opened or if there was
|
||||||
insufficient memory to allocate the (de)compression state; errno
|
insufficient memory to allocate the (de)compression state; errno
|
||||||
can be checked to distinguish the two cases (if errno is zero, the
|
can be checked to distinguish the two cases (if errno is zero, the
|
||||||
zlib error is Z_MEM_ERROR).
|
zlib error is Z_MEM_ERROR). */
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef MOZILLA_CLIENT
|
ZEXTERN gzFile ZEXPORT gzdopen OF((int fd, const char *mode));
|
||||||
PR_PUBLIC_API(extern gzFile) gzdopen (int fd, const char *mode);
|
|
||||||
#else
|
|
||||||
extern gzFile EXPORT gzdopen OF((int fd, const char *mode));
|
|
||||||
#endif
|
|
||||||
/*
|
/*
|
||||||
gzdopen() associates a gzFile with the file descriptor fd. File
|
gzdopen() associates a gzFile with the file descriptor fd. File
|
||||||
descriptors are obtained from calls like open, dup, creat, pipe or
|
descriptors are obtained from calls like open, dup, creat, pipe or
|
||||||
@ -730,11 +685,15 @@ extern gzFile EXPORT gzdopen OF((int fd, const char *mode));
|
|||||||
the (de)compression state.
|
the (de)compression state.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifdef MOZILLA_CLIENT
|
ZEXTERN int ZEXPORT gzsetparams OF((gzFile file, int level, int strategy));
|
||||||
PR_PUBLIC_API(extern int) gzread (gzFile file, voidp buf, unsigned len);
|
/*
|
||||||
#else
|
Dynamically update the compression level or strategy. See the description
|
||||||
extern int EXPORT gzread OF((gzFile file, voidp buf, unsigned len));
|
of deflateInit2 for the meaning of these parameters.
|
||||||
#endif
|
gzsetparams returns Z_OK if success, or Z_STREAM_ERROR if the file was not
|
||||||
|
opened for writing.
|
||||||
|
*/
|
||||||
|
|
||||||
|
ZEXTERN int ZEXPORT gzread OF((gzFile file, voidp buf, unsigned len));
|
||||||
/*
|
/*
|
||||||
Reads the given number of uncompressed bytes from the compressed file.
|
Reads the given number of uncompressed bytes from the compressed file.
|
||||||
If the input file was not in gzip format, gzread copies the given number
|
If the input file was not in gzip format, gzread copies the given number
|
||||||
@ -742,22 +701,50 @@ extern int EXPORT gzread OF((gzFile file, voidp buf, unsigned len));
|
|||||||
gzread returns the number of uncompressed bytes actually read (0 for
|
gzread returns the number of uncompressed bytes actually read (0 for
|
||||||
end of file, -1 for error). */
|
end of file, -1 for error). */
|
||||||
|
|
||||||
#ifdef MOZILLA_CLIENT
|
ZEXTERN int ZEXPORT gzwrite OF((gzFile file,
|
||||||
PR_PUBLIC_API(extern int) gzwrite (gzFile file, const voidp buf, unsigned len);
|
const voidp buf, unsigned len));
|
||||||
#else
|
|
||||||
extern int EXPORT gzwrite OF((gzFile file, const voidp buf, unsigned len));
|
|
||||||
#endif
|
|
||||||
/*
|
/*
|
||||||
Writes the given number of uncompressed bytes into the compressed file.
|
Writes the given number of uncompressed bytes into the compressed file.
|
||||||
gzwrite returns the number of uncompressed bytes actually written
|
gzwrite returns the number of uncompressed bytes actually written
|
||||||
(0 in case of error).
|
(0 in case of error).
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifdef MOZILLA_CLIENT
|
ZEXTERN int ZEXPORTVA gzprintf OF((gzFile file, const char *format, ...));
|
||||||
PR_PUBLIC_API(extern int) gzflush (gzFile file, int flush);
|
/*
|
||||||
#else
|
Converts, formats, and writes the args to the compressed file under
|
||||||
extern int EXPORT gzflush OF((gzFile file, int flush));
|
control of the format string, as in fprintf. gzprintf returns the number of
|
||||||
#endif
|
uncompressed bytes actually written (0 in case of error).
|
||||||
|
*/
|
||||||
|
|
||||||
|
ZEXTERN int ZEXPORT gzputs OF((gzFile file, const char *s));
|
||||||
|
/*
|
||||||
|
Writes the given null-terminated string to the compressed file, excluding
|
||||||
|
the terminating null character.
|
||||||
|
gzputs returns the number of characters written, or -1 in case of error.
|
||||||
|
*/
|
||||||
|
|
||||||
|
ZEXTERN char * ZEXPORT gzgets OF((gzFile file, char *buf, int len));
|
||||||
|
/*
|
||||||
|
Reads bytes from the compressed file until len-1 characters are read, or
|
||||||
|
a newline character is read and transferred to buf, or an end-of-file
|
||||||
|
condition is encountered. The string is then terminated with a null
|
||||||
|
character.
|
||||||
|
gzgets returns buf, or Z_NULL in case of error.
|
||||||
|
*/
|
||||||
|
|
||||||
|
ZEXTERN int ZEXPORT gzputc OF((gzFile file, int c));
|
||||||
|
/*
|
||||||
|
Writes c, converted to an unsigned char, into the compressed file.
|
||||||
|
gzputc returns the value that was written, or -1 in case of error.
|
||||||
|
*/
|
||||||
|
|
||||||
|
ZEXTERN int ZEXPORT gzgetc OF((gzFile file));
|
||||||
|
/*
|
||||||
|
Reads one byte from the compressed file. gzgetc returns this byte
|
||||||
|
or -1 in case of end of file or error.
|
||||||
|
*/
|
||||||
|
|
||||||
|
ZEXTERN int ZEXPORT gzflush OF((gzFile file, int flush));
|
||||||
/*
|
/*
|
||||||
Flushes all pending output into the compressed file. The parameter
|
Flushes all pending output into the compressed file. The parameter
|
||||||
flush is as in the deflate() function. The return value is the zlib
|
flush is as in the deflate() function. The return value is the zlib
|
||||||
@ -767,22 +754,54 @@ extern int EXPORT gzflush OF((gzFile file, int flush));
|
|||||||
degrade compression.
|
degrade compression.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifdef MOZILLA_CLIENT
|
ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile file,
|
||||||
PR_PUBLIC_API(extern int) gzclose (gzFile file);
|
z_off_t offset, int whence));
|
||||||
#else
|
/*
|
||||||
extern int EXPORT gzclose OF((gzFile file));
|
Sets the starting position for the next gzread or gzwrite on the
|
||||||
#endif
|
given compressed file. The offset represents a number of bytes in the
|
||||||
|
uncompressed data stream. The whence parameter is defined as in lseek(2);
|
||||||
|
the value SEEK_END is not supported.
|
||||||
|
If the file is opened for reading, this function is emulated but can be
|
||||||
|
extremely slow. If the file is opened for writing, only forward seeks are
|
||||||
|
supported; gzseek then compresses a sequence of zeroes up to the new
|
||||||
|
starting position.
|
||||||
|
|
||||||
|
gzseek returns the resulting offset location as measured in bytes from
|
||||||
|
the beginning of the uncompressed stream, or -1 in case of error, in
|
||||||
|
particular if the file is opened for writing and the new starting position
|
||||||
|
would be before the current position.
|
||||||
|
*/
|
||||||
|
|
||||||
|
ZEXTERN int ZEXPORT gzrewind OF((gzFile file));
|
||||||
|
/*
|
||||||
|
Rewinds the given file. This function is supported only for reading.
|
||||||
|
|
||||||
|
gzrewind(file) is equivalent to (int)gzseek(file, 0L, SEEK_SET)
|
||||||
|
*/
|
||||||
|
|
||||||
|
ZEXTERN z_off_t ZEXPORT gztell OF((gzFile file));
|
||||||
|
/*
|
||||||
|
Returns the starting position for the next gzread or gzwrite on the
|
||||||
|
given compressed file. This position represents a number of bytes in the
|
||||||
|
uncompressed data stream.
|
||||||
|
|
||||||
|
gztell(file) is equivalent to gzseek(file, 0L, SEEK_CUR)
|
||||||
|
*/
|
||||||
|
|
||||||
|
ZEXTERN int ZEXPORT gzeof OF((gzFile file));
|
||||||
|
/*
|
||||||
|
Returns 1 when EOF has previously been detected reading the given
|
||||||
|
input stream, otherwise zero.
|
||||||
|
*/
|
||||||
|
|
||||||
|
ZEXTERN int ZEXPORT gzclose OF((gzFile file));
|
||||||
/*
|
/*
|
||||||
Flushes all pending output if necessary, closes the compressed file
|
Flushes all pending output if necessary, closes the compressed file
|
||||||
and deallocates all the (de)compression state. The return value is the zlib
|
and deallocates all the (de)compression state. The return value is the zlib
|
||||||
error number (see function gzerror below).
|
error number (see function gzerror below).
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifdef MOZILLA_CLIENT
|
ZEXTERN const char * ZEXPORT gzerror OF((gzFile file, int *errnum));
|
||||||
PR_PUBLIC_API(extern const char *) gzerror (gzFile file, int *errnum);
|
|
||||||
#else
|
|
||||||
extern const char * EXPORT gzerror OF((gzFile file, int *errnum));
|
|
||||||
#endif
|
|
||||||
/*
|
/*
|
||||||
Returns the error message for the last error which occurred on the
|
Returns the error message for the last error which occurred on the
|
||||||
given compressed file. errnum is set to zlib error number. If an
|
given compressed file. errnum is set to zlib error number. If an
|
||||||
@ -799,11 +818,7 @@ extern const char * EXPORT gzerror OF((gzFile file, int *errnum));
|
|||||||
compression library.
|
compression library.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifdef MOZILLA_CLIENT
|
ZEXTERN uLong ZEXPORT adler32 OF((uLong adler, const Bytef *buf, uInt len));
|
||||||
PR_PUBLIC_API(extern uLong) adler32 (uLong adler, const Bytef *buf, uInt len);
|
|
||||||
#else
|
|
||||||
extern uLong EXPORT adler32 OF((uLong adler, const Bytef *buf, uInt len));
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Update a running Adler-32 checksum with the bytes buf[0..len-1] and
|
Update a running Adler-32 checksum with the bytes buf[0..len-1] and
|
||||||
@ -820,11 +835,7 @@ extern uLong EXPORT adler32 OF((uLong adler, const Bytef *buf, uInt len));
|
|||||||
if (adler != original_adler) error();
|
if (adler != original_adler) error();
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifdef MOZILLA_CLIENT
|
ZEXTERN uLong ZEXPORT crc32 OF((uLong crc, const Bytef *buf, uInt len));
|
||||||
PR_PUBLIC_API(extern uLong) crc32 (uLong crc, const Bytef *buf, uInt len);
|
|
||||||
#else
|
|
||||||
extern uLong EXPORT crc32 OF((uLong crc, const Bytef *buf, uInt len));
|
|
||||||
#endif
|
|
||||||
/*
|
/*
|
||||||
Update a running crc with the bytes buf[0..len-1] and return the updated
|
Update a running crc with the bytes buf[0..len-1] and return the updated
|
||||||
crc. If buf is NULL, this function returns the required initial value
|
crc. If buf is NULL, this function returns the required initial value
|
||||||
@ -846,44 +857,34 @@ extern uLong EXPORT crc32 OF((uLong crc, const Bytef *buf, uInt len));
|
|||||||
/* deflateInit and inflateInit are macros to allow checking the zlib version
|
/* deflateInit and inflateInit are macros to allow checking the zlib version
|
||||||
* and the compiler's view of z_stream:
|
* and the compiler's view of z_stream:
|
||||||
*/
|
*/
|
||||||
#ifdef MOZILLA_CLIENT
|
ZEXTERN int ZEXPORT deflateInit_ OF((z_streamp strm, int level,
|
||||||
PR_PUBLIC_API(extern int) deflateInit_ (z_streamp strm, int level, const char *version,
|
const char *version, int stream_size));
|
||||||
int stream_size);
|
ZEXTERN int ZEXPORT inflateInit_ OF((z_streamp strm,
|
||||||
PR_PUBLIC_API(extern int) inflateInit_ (z_streamp strm, const char *version,
|
const char *version, int stream_size));
|
||||||
int stream_size);
|
ZEXTERN int ZEXPORT deflateInit2_ OF((z_streamp strm, int level, int method,
|
||||||
PR_PUBLIC_API(extern int) deflateInit2_ (z_streamp strm, int level, int method,
|
int windowBits, int memLevel,
|
||||||
int windowBits, int memLevel, int strategy,
|
int strategy, const char *version,
|
||||||
const char *version, int stream_size);
|
int stream_size));
|
||||||
PR_PUBLIC_API(extern int) inflateInit2_ (z_streamp strm, int windowBits,
|
ZEXTERN int ZEXPORT inflateInit2_ OF((z_streamp strm, int windowBits,
|
||||||
const char *version, int stream_size);
|
const char *version, int stream_size));
|
||||||
#else
|
|
||||||
extern int EXPORT deflateInit_ OF((z_streamp strm, int level, const char *version,
|
|
||||||
int stream_size));
|
|
||||||
extern int EXPORT inflateInit_ OF((z_streamp strm, const char *version,
|
|
||||||
int stream_size));
|
|
||||||
extern int EXPORT deflateInit2_ OF((z_streamp strm, int level, int method,
|
|
||||||
int windowBits, int memLevel, int strategy,
|
|
||||||
const char *version, int stream_size));
|
|
||||||
extern int EXPORT inflateInit2_ OF((z_streamp strm, int windowBits,
|
|
||||||
const char *version, int stream_size));
|
|
||||||
#endif /* MOZILLA_CLIENT */
|
|
||||||
|
|
||||||
|
|
||||||
#define deflateInit(strm, level) \
|
#define deflateInit(strm, level) \
|
||||||
deflateInit_((strm), (level), ZLIB_VERSION, sizeof(z_stream))
|
deflateInit_((strm), (level), ZLIB_VERSION, sizeof(z_stream))
|
||||||
#define inflateInit(strm) \
|
#define inflateInit(strm) \
|
||||||
inflateInit_((strm), ZLIB_VERSION, sizeof(z_stream))
|
inflateInit_((strm), ZLIB_VERSION, sizeof(z_stream))
|
||||||
#define deflateInit2(strm, level, method, windowBits, memLevel, strategy) \
|
#define deflateInit2(strm, level, method, windowBits, memLevel, strategy) \
|
||||||
deflateInit2_((strm),(level),(method),(windowBits),(memLevel),\
|
deflateInit2_((strm),(level),(method),(windowBits),(memLevel),\
|
||||||
(strategy), ZLIB_VERSION, sizeof(z_stream))
|
(strategy), ZLIB_VERSION, sizeof(z_stream))
|
||||||
#define inflateInit2(strm, windowBits) \
|
#define inflateInit2(strm, windowBits) \
|
||||||
inflateInit2_((strm), (windowBits), ZLIB_VERSION, sizeof(z_stream))
|
inflateInit2_((strm), (windowBits), ZLIB_VERSION, sizeof(z_stream))
|
||||||
|
|
||||||
|
|
||||||
#if !defined(_Z_UTIL_H) && !defined(NO_DUMMY_DECL)
|
#if !defined(_Z_UTIL_H) && !defined(NO_DUMMY_DECL)
|
||||||
struct internal_state {int dummy;}; /* hack for buggy compilers */
|
struct internal_state {int dummy;}; /* hack for buggy compilers */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
uLongf *get_crc_table OF((void)); /* can be used by asm versions of crc32() */
|
ZEXTERN const char * ZEXPORT zError OF((int err));
|
||||||
|
ZEXTERN int ZEXPORT inflateSyncPoint OF((z_streamp z));
|
||||||
|
ZEXTERN const uLongf * ZEXPORT get_crc_table OF((void));
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
@ -1,19 +1,12 @@
|
|||||||
/* zutil.c -- target dependent utility functions for the compression library
|
/* zutil.c -- target dependent utility functions for the compression library
|
||||||
* Copyright (C) 1995-1996 Jean-loup Gailly.
|
* Copyright (C) 1995-1998 Jean-loup Gailly.
|
||||||
* For conditions of distribution and use, see copyright notice in zlib.h
|
* For conditions of distribution and use, see copyright notice in zlib.h
|
||||||
*/
|
*/
|
||||||
/* This file was modified since it was taken from the zlib distribution */
|
|
||||||
/* $Id: zutil.c,v 3.6 2000/08/19 18:50:07 sgehani%netscape.com Exp $ */
|
|
||||||
|
|
||||||
#include <stdio.h>
|
/* @(#) $Id: zutil.c,v 3.7 2001/06/30 23:38:03 leaf%mozilla.org Exp $ */
|
||||||
|
|
||||||
#include "zutil.h"
|
#include "zutil.h"
|
||||||
|
|
||||||
#ifdef MOZILLA_CLIENT
|
|
||||||
#include "prtypes.h"
|
|
||||||
#include "prlog.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
struct internal_state {int dummy;}; /* for buggy compilers */
|
struct internal_state {int dummy;}; /* for buggy compilers */
|
||||||
|
|
||||||
#ifndef STDC
|
#ifndef STDC
|
||||||
@ -33,26 +26,41 @@ const char *z_errmsg[10] = {
|
|||||||
""};
|
""};
|
||||||
|
|
||||||
|
|
||||||
PR_PUBLIC_API(const char *) zlibVersion()
|
const char * ZEXPORT zlibVersion()
|
||||||
{
|
{
|
||||||
return ZLIB_VERSION;
|
return ZLIB_VERSION;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(DEBUG) && defined(MOZILLA_CLIENT)
|
#ifdef DEBUG
|
||||||
|
|
||||||
|
# ifndef verbose
|
||||||
|
# define verbose 0
|
||||||
|
# endif
|
||||||
|
int z_verbose = verbose;
|
||||||
|
|
||||||
void z_error (m)
|
void z_error (m)
|
||||||
char *m;
|
char *m;
|
||||||
{
|
{
|
||||||
#ifndef XP_UNIX
|
fprintf(stderr, "%s\n", m);
|
||||||
PR_ASSERT(0);
|
exit(1);
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* exported to allow conversion of error code to string for compress() and
|
||||||
|
* uncompress()
|
||||||
|
*/
|
||||||
|
const char * ZEXPORT zError(err)
|
||||||
|
int err;
|
||||||
|
{
|
||||||
|
return ERR_MSG(err);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#ifndef HAVE_MEMCPY
|
#ifndef HAVE_MEMCPY
|
||||||
|
|
||||||
void zmemcpy(dest, source, len)
|
void zmemcpy(dest, source, len)
|
||||||
Bytef* dest;
|
Bytef* dest;
|
||||||
Bytef* source;
|
const Bytef* source;
|
||||||
uInt len;
|
uInt len;
|
||||||
{
|
{
|
||||||
if (len == 0) return;
|
if (len == 0) return;
|
||||||
@ -62,8 +70,8 @@ void zmemcpy(dest, source, len)
|
|||||||
}
|
}
|
||||||
|
|
||||||
int zmemcmp(s1, s2, len)
|
int zmemcmp(s1, s2, len)
|
||||||
Bytef* s1;
|
const Bytef* s1;
|
||||||
Bytef* s2;
|
const Bytef* s2;
|
||||||
uInt len;
|
uInt len;
|
||||||
{
|
{
|
||||||
uInt j;
|
uInt j;
|
||||||
@ -170,7 +178,7 @@ void zcfree (voidpf opaque, voidpf ptr)
|
|||||||
|
|
||||||
# define MY_ZCALLOC
|
# define MY_ZCALLOC
|
||||||
|
|
||||||
#if (!defined(_MSC_VER) || (_MSC_VER < 600))
|
#if (!defined(_MSC_VER) || (_MSC_VER <= 600))
|
||||||
# define _halloc halloc
|
# define _halloc halloc
|
||||||
# define _hfree hfree
|
# define _hfree hfree
|
||||||
#endif
|
#endif
|
||||||
|
@ -1,30 +1,30 @@
|
|||||||
/* zutil.h -- internal interface and configuration of the compression library
|
/* zutil.h -- internal interface and configuration of the compression library
|
||||||
* Copyright (C) 1995-1996 Jean-loup Gailly.
|
* Copyright (C) 1995-1998 Jean-loup Gailly.
|
||||||
* For conditions of distribution and use, see copyright notice in zlib.h
|
* For conditions of distribution and use, see copyright notice in zlib.h
|
||||||
*/
|
*/
|
||||||
/* This file was modified since it was taken from the zlib distribution */
|
|
||||||
/* WARNING: this file should *not* be used by applications. It is
|
/* WARNING: this file should *not* be used by applications. It is
|
||||||
part of the implementation of the compression library and is
|
part of the implementation of the compression library and is
|
||||||
subject to change. Applications should only use zlib.h.
|
subject to change. Applications should only use zlib.h.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* $Id: zutil.h,v 3.2 1999/08/26 00:10:19 briano%netscape.com Exp $ */
|
/* @(#) $Id: zutil.h,v 3.3 2001/06/30 23:38:04 leaf%mozilla.org Exp $ */
|
||||||
|
|
||||||
#ifndef _Z_UTIL_H
|
#ifndef _Z_UTIL_H
|
||||||
#define _Z_UTIL_H
|
#define _Z_UTIL_H
|
||||||
|
|
||||||
#include "zlib.h"
|
#include "zlib.h"
|
||||||
|
|
||||||
#if defined(MSDOS)||defined(VMS)||defined(CRAY)||defined(WIN32)||defined(RISCOS)
|
|
||||||
# include <stddef.h>
|
|
||||||
# include <errno.h>
|
|
||||||
#else
|
|
||||||
extern int errno;
|
|
||||||
#endif
|
|
||||||
#ifdef STDC
|
#ifdef STDC
|
||||||
|
# include <stddef.h>
|
||||||
# include <string.h>
|
# include <string.h>
|
||||||
# include <stdlib.h>
|
# include <stdlib.h>
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef NO_ERRNO_H
|
||||||
|
extern int errno;
|
||||||
|
#else
|
||||||
|
# include <errno.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifndef local
|
#ifndef local
|
||||||
# define local static
|
# define local static
|
||||||
@ -75,8 +75,14 @@ extern const char *z_errmsg[10]; /* indexed by 2-zlib_error */
|
|||||||
|
|
||||||
#ifdef MSDOS
|
#ifdef MSDOS
|
||||||
# define OS_CODE 0x00
|
# define OS_CODE 0x00
|
||||||
# ifdef __TURBOC__
|
# if defined(__TURBOC__) || defined(__BORLANDC__)
|
||||||
# include <alloc.h>
|
# if(__STDC__ == 1) && (defined(__LARGE__) || defined(__COMPACT__))
|
||||||
|
/* Allow compilation with ANSI keywords only enabled */
|
||||||
|
void _Cdecl farfree( void *block );
|
||||||
|
void *_Cdecl farmalloc( unsigned long nbytes );
|
||||||
|
# else
|
||||||
|
# include <alloc.h>
|
||||||
|
# endif
|
||||||
# else /* MSC or DJGPP */
|
# else /* MSC or DJGPP */
|
||||||
# include <malloc.h>
|
# include <malloc.h>
|
||||||
# endif
|
# endif
|
||||||
@ -92,7 +98,7 @@ extern const char *z_errmsg[10]; /* indexed by 2-zlib_error */
|
|||||||
|
|
||||||
#if defined(VAXC) || defined(VMS)
|
#if defined(VAXC) || defined(VMS)
|
||||||
# define OS_CODE 0x02
|
# define OS_CODE 0x02
|
||||||
# define FOPEN(name, mode) \
|
# define F_OPEN(name, mode) \
|
||||||
fopen((name), (mode), "mbc=60", "ctx=stm", "rfm=fix", "mrs=512")
|
fopen((name), (mode), "mbc=60", "ctx=stm", "rfm=fix", "mrs=512")
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -104,8 +110,15 @@ extern const char *z_errmsg[10]; /* indexed by 2-zlib_error */
|
|||||||
# define OS_CODE 0x05
|
# define OS_CODE 0x05
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef MACOS
|
#if defined(MACOS) || defined(TARGET_OS_MAC)
|
||||||
# define OS_CODE 0x07
|
# define OS_CODE 0x07
|
||||||
|
# if defined(__MWERKS__) && __dest_os != __be_os && __dest_os != __win32_os
|
||||||
|
# include <unix.h> /* for fdopen */
|
||||||
|
# else
|
||||||
|
# ifndef fdopen
|
||||||
|
# define fdopen(fd,mode) NULL /* No fdopen() */
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef __50SERIES /* Prime/PRIMOS */
|
#ifdef __50SERIES /* Prime/PRIMOS */
|
||||||
@ -120,22 +133,25 @@ extern const char *z_errmsg[10]; /* indexed by 2-zlib_error */
|
|||||||
# define fdopen(fd,mode) NULL /* No fdopen() */
|
# define fdopen(fd,mode) NULL /* No fdopen() */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if (defined(_MSC_VER) && (_MSC_VER > 600))
|
||||||
|
# define fdopen(fd,type) _fdopen(fd,type)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/* Common defaults */
|
/* Common defaults */
|
||||||
|
|
||||||
#ifndef OS_CODE
|
#ifndef OS_CODE
|
||||||
# define OS_CODE 0x03 /* assume Unix */
|
# define OS_CODE 0x03 /* assume Unix */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef FOPEN
|
#ifndef F_OPEN
|
||||||
# define FOPEN(name, mode) fopen((name), (mode))
|
# define F_OPEN(name, mode) fopen((name), (mode))
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* functions */
|
/* functions */
|
||||||
|
|
||||||
#ifdef HAVE_STRERROR
|
#ifdef HAVE_STRERROR
|
||||||
#ifndef MOZILLA_CLIENT
|
|
||||||
extern char *strerror OF((int));
|
extern char *strerror OF((int));
|
||||||
#endif
|
|
||||||
# define zstrerror(errnum) strerror(errnum)
|
# define zstrerror(errnum) strerror(errnum)
|
||||||
#else
|
#else
|
||||||
# define zstrerror(errnum) ""
|
# define zstrerror(errnum) ""
|
||||||
@ -144,9 +160,10 @@ extern const char *z_errmsg[10]; /* indexed by 2-zlib_error */
|
|||||||
#if defined(pyr)
|
#if defined(pyr)
|
||||||
# define NO_MEMCPY
|
# define NO_MEMCPY
|
||||||
#endif
|
#endif
|
||||||
#if (defined(M_I86SM) || defined(M_I86MM)) && !defined(_MSC_VER)
|
#if defined(SMALL_MEDIUM) && !defined(_MSC_VER) && !defined(__SC__)
|
||||||
/* Use our own functions for small and medium model with MSC <= 5.0.
|
/* Use our own functions for small and medium model with MSC <= 5.0.
|
||||||
* You may have to use the same strategy for Borland C (untested).
|
* You may have to use the same strategy for Borland C (untested).
|
||||||
|
* The __SC__ check is for Symantec.
|
||||||
*/
|
*/
|
||||||
# define NO_MEMCPY
|
# define NO_MEMCPY
|
||||||
#endif
|
#endif
|
||||||
@ -164,30 +181,23 @@ extern const char *z_errmsg[10]; /* indexed by 2-zlib_error */
|
|||||||
# define zmemzero(dest, len) memset(dest, 0, len)
|
# define zmemzero(dest, len) memset(dest, 0, len)
|
||||||
# endif
|
# endif
|
||||||
#else
|
#else
|
||||||
extern void zmemcpy OF((Bytef* dest, Bytef* source, uInt len));
|
extern void zmemcpy OF((Bytef* dest, const Bytef* source, uInt len));
|
||||||
extern int zmemcmp OF((Bytef* s1, Bytef* s2, uInt len));
|
extern int zmemcmp OF((const Bytef* s1, const Bytef* s2, uInt len));
|
||||||
extern void zmemzero OF((Bytef* dest, uInt len));
|
extern void zmemzero OF((Bytef* dest, uInt len));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Diagnostic functions */
|
/* Diagnostic functions */
|
||||||
#ifdef DEBUG_ZLIB
|
#ifdef DEBUG
|
||||||
# include <stdio.h>
|
# include <stdio.h>
|
||||||
# ifndef verbose
|
extern int z_verbose;
|
||||||
# define verbose 0
|
|
||||||
# endif
|
|
||||||
extern void z_error OF((char *m));
|
extern void z_error OF((char *m));
|
||||||
# define Assert(cond,msg) {if(!(cond)) z_error(msg);}
|
# define Assert(cond,msg) {if(!(cond)) z_error(msg);}
|
||||||
# define Trace(x) fprintf x
|
# define Trace(x) {if (z_verbose>=0) fprintf x ;}
|
||||||
# define Tracev(x) {if (verbose) fprintf x ;}
|
# define Tracev(x) {if (z_verbose>0) fprintf x ;}
|
||||||
# define Tracevv(x) {if (verbose>1) fprintf x ;}
|
# define Tracevv(x) {if (z_verbose>1) fprintf x ;}
|
||||||
# define Tracec(c,x) {if (verbose && (c)) fprintf x ;}
|
# define Tracec(c,x) {if (z_verbose>0 && (c)) fprintf x ;}
|
||||||
# define Tracecv(c,x) {if (verbose>1 && (c)) fprintf x ;}
|
# define Tracecv(c,x) {if (z_verbose>1 && (c)) fprintf x ;}
|
||||||
#else
|
#else
|
||||||
# include <stdio.h>
|
|
||||||
# ifndef verbose
|
|
||||||
# define verbose 0
|
|
||||||
# endif
|
|
||||||
extern void z_error OF((char *m));
|
|
||||||
# define Assert(cond,msg)
|
# define Assert(cond,msg)
|
||||||
# define Trace(x)
|
# define Trace(x)
|
||||||
# define Tracev(x)
|
# define Tracev(x)
|
||||||
@ -197,8 +207,8 @@ extern const char *z_errmsg[10]; /* indexed by 2-zlib_error */
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
typedef uLong (*check_func) OF((uLong check, const Bytef *buf, uInt len));
|
typedef uLong (ZEXPORT *check_func) OF((uLong check, const Bytef *buf,
|
||||||
|
uInt len));
|
||||||
voidpf zcalloc OF((voidpf opaque, unsigned items, unsigned size));
|
voidpf zcalloc OF((voidpf opaque, unsigned items, unsigned size));
|
||||||
void zcfree OF((voidpf opaque, voidpf ptr));
|
void zcfree OF((voidpf opaque, voidpf ptr));
|
||||||
|
|
||||||
|
@ -24,7 +24,7 @@ MODULE = necko
|
|||||||
|
|
||||||
LIBRARY_NAME=nkcnvts_s
|
LIBRARY_NAME=nkcnvts_s
|
||||||
|
|
||||||
LCFLAGS = -DWIN32_LEAN_AND_MEAN -D_IMPL_NS_NET
|
LCFLAGS = -DWIN32_LEAN_AND_MEAN -D_IMPL_NS_NET -DZLIB_DLL
|
||||||
# Add this for performance TXT-HTML performance #'s: -DMOZ_PERF_METRICS
|
# Add this for performance TXT-HTML performance #'s: -DMOZ_PERF_METRICS
|
||||||
|
|
||||||
EXPORTS = \
|
EXPORTS = \
|
||||||
|
@ -31,7 +31,7 @@ MODULE = xpinstall
|
|||||||
LIBRARY_NAME = xpinstal
|
LIBRARY_NAME = xpinstal
|
||||||
MODULE_NAME = nsSoftwareUpdate
|
MODULE_NAME = nsSoftwareUpdate
|
||||||
|
|
||||||
DEFINES=-D_IMPL_NS_DOM -DWIN32_LEAN_AND_MEAN
|
DEFINES=-D_IMPL_NS_DOM -DWIN32_LEAN_AND_MEAN -DZLIB_DLL
|
||||||
|
|
||||||
INCLUDES=-I..\cleanup
|
INCLUDES=-I..\cleanup
|
||||||
|
|
||||||
|
@ -20,6 +20,7 @@
|
|||||||
* Contributor(s):
|
* Contributor(s):
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include "zlib.h"
|
||||||
#include "nsFileSpec.h"
|
#include "nsFileSpec.h"
|
||||||
#include "prmem.h"
|
#include "prmem.h"
|
||||||
#include "nsXPIDLString.h"
|
#include "nsXPIDLString.h"
|
||||||
@ -27,7 +28,6 @@
|
|||||||
#include "nsInstallPatch.h"
|
#include "nsInstallPatch.h"
|
||||||
#include "nsInstallResources.h"
|
#include "nsInstallResources.h"
|
||||||
#include "nsIDOMInstallVersion.h"
|
#include "nsIDOMInstallVersion.h"
|
||||||
#include "zlib.h"
|
|
||||||
|
|
||||||
#include "gdiff.h"
|
#include "gdiff.h"
|
||||||
|
|
||||||
|
@ -31,31 +31,16 @@ RESFILE = $(MODULE).res
|
|||||||
|
|
||||||
OBJS = \
|
OBJS = \
|
||||||
.\$(OBJDIR)\nsinstall.obj \
|
.\$(OBJDIR)\nsinstall.obj \
|
||||||
.\$(OBJDIR)\adler32.obj \
|
|
||||||
.\$(OBJDIR)\infblock.obj \
|
|
||||||
.\$(OBJDIR)\infcodes.obj \
|
|
||||||
.\$(OBJDIR)\inffast.obj \
|
|
||||||
.\$(OBJDIR)\inflate.obj \
|
|
||||||
.\$(OBJDIR)\inftrees.obj \
|
|
||||||
.\$(OBJDIR)\infutil.obj \
|
|
||||||
.\$(OBJDIR)\uncompr.obj \
|
|
||||||
.\$(OBJDIR)\zutil.obj \
|
|
||||||
$(NULL)
|
$(NULL)
|
||||||
|
|
||||||
LCFLAGS= -UMOZILLA_CLIENT
|
LLIBS=$(DIST)\lib\zlib_s.lib
|
||||||
|
|
||||||
include <$(DEPTH)\config\rules.mak>
|
include <$(DEPTH)\config\rules.mak>
|
||||||
|
|
||||||
docopy:
|
|
||||||
$(MAKE_INSTALL) $(DEPTH)\modules\zlib\src\*.h .
|
|
||||||
$(MAKE_INSTALL) $(DEPTH)\modules\zlib\src\*.c .
|
|
||||||
|
|
||||||
export:: docopy
|
|
||||||
|
|
||||||
install:: $(PROGRAM)
|
install:: $(PROGRAM)
|
||||||
$(MAKE_INSTALL) $(PROGRAM) $(DIST)\install
|
$(MAKE_INSTALL) $(PROGRAM) $(DIST)\install
|
||||||
|
|
||||||
clobber_all::
|
clobber_all::
|
||||||
$(RM) inf*.* adler32.c uncompr.c z*.* trees.c deflate.* compr* gzio* example.c crc* mini*
|
$(RM) inf*.* adler32.c uncompr.c z*.* trees.* deflate.* compr* gzio* example.c crc* mini*
|
||||||
$(RM) $(DIST)\install\$(MODULE).exe
|
$(RM) $(DIST)\install\$(MODULE).exe
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user