195 lines
7.4 KiB
C
195 lines
7.4 KiB
C
//
|
|
// zlib.h -- interface of the 'zlib' general purpose compression library
|
|
// version 1.1.3, July 9th, 1998
|
|
//
|
|
// Copyright (C) 1995-1998 Jean-loup Gailly and Mark Adler
|
|
//
|
|
// This software is provided 'as-is', without any express or implied
|
|
// warranty. In no event will the authors be held liable for any damages
|
|
// arising from the use of this software.
|
|
//
|
|
// Permission is granted to anyone to use this software for any purpose,
|
|
// including commercial applications, and to alter it and redistribute it
|
|
// freely, subject to the following restrictions:
|
|
//
|
|
// 1. The origin of this software must not be misrepresented; you must not
|
|
// claim that you wrote the original software. If you use this software
|
|
// in a product, an acknowledgment in the product documentation would be
|
|
// appreciated but is not required.
|
|
// 2. Altered source versions must be plainly marked as such, and must not be
|
|
// misrepresented as being the original software.
|
|
// 3. This notice may not be removed or altered from any source distribution.
|
|
//
|
|
// Jean-loup Gailly Mark Adler
|
|
// jloup@gzip.org madler@alumni.caltech.edu
|
|
//
|
|
// The data format used by the zlib library is described by RFCs (Request for
|
|
// Comments) 1950 to 1952 in the files ftp://ds.internic.net/rfc/rfc1950.txt
|
|
// (zlib format), rfc1951.txt (deflate format) and rfc1952.txt (gzip format).
|
|
//
|
|
|
|
// The 'zlib' compression library provides in-memory compression and
|
|
// decompression functions, including integrity checks of the uncompressed
|
|
// data. This version of the library supports only one compression method
|
|
// (deflation) but other algorithms will be added later and will have the same
|
|
// stream interface.
|
|
//
|
|
// 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
|
|
// repeated calls of the compression function. In the latter case, the
|
|
// application must provide more input and/or consume the output
|
|
// (providing more output space) before each call.
|
|
//
|
|
// 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.
|
|
|
|
// This particular implementation has been heavily modified by jscott@ravensoft.com
|
|
// to increase inflate/deflate speeds on 32 bit machines.
|
|
|
|
// for more info about .ZIP format, see
|
|
// ftp://ftp.cdrom.com/pub/infozip/doc/appnote-970311-iz.zip
|
|
// PkWare has also a specification at :
|
|
// ftp://ftp.pkware.com/probdesc.zip
|
|
|
|
// ========================================================================================
|
|
// External calls and defines required for the zlib
|
|
// ========================================================================================
|
|
|
|
// The deflate compression method
|
|
#define ZF_STORED 0
|
|
#define ZF_DEFLATED 8
|
|
|
|
// Compression levels
|
|
typedef enum
|
|
{
|
|
Z_STORE_COMPRESSION,
|
|
Z_FAST_COMPRESSION_LOW,
|
|
Z_FAST_COMPRESSION,
|
|
Z_FAST_COMPRESSION_HIGH,
|
|
Z_SLOW_COMPRESSION_LOWEST,
|
|
Z_SLOW_COMPRESSION_LOW,
|
|
Z_DEFAULT_COMPRESSION,
|
|
Z_SLOW_COMPRESSION_HIGH,
|
|
Z_SLOW_COMPRESSION_HIGHEST,
|
|
Z_MAX_COMPRESSION,
|
|
} ELevel;
|
|
|
|
// Allowed flush values
|
|
typedef enum
|
|
{
|
|
Z_NEED_MORE = -1, // Special case when finishing up the stream
|
|
Z_NO_FLUSH,
|
|
Z_SYNC_FLUSH, // Sync up the stream ready for another call
|
|
Z_FINISH // Finish up the stream
|
|
} EFlush;
|
|
|
|
// Return codes for the compression/decompression functions. Negative
|
|
// values are errors, positive values are used for special but normal events.
|
|
typedef enum
|
|
{
|
|
Z_STREAM_ERROR = -3, // Basic error from failed sanity checks
|
|
Z_BUF_ERROR, // Not enough input or output
|
|
Z_DATA_ERROR, // Invalid data in the stream
|
|
Z_OK,
|
|
Z_STREAM_END // End of stream
|
|
} EStatus;
|
|
|
|
// Maximum value for windowBits in deflateInit and inflateInit.
|
|
// The memory requirements for inflate are (in bytes) 1 << windowBits
|
|
// that is, 32K for windowBits=15 (default value) plus a few kilobytes
|
|
// for small objects.
|
|
#define MAX_WBITS 15 // 32K LZ77 window
|
|
#define WINDOW_SIZE (1 << MAX_WBITS)
|
|
#define BIG_WINDOW_SIZE (WINDOW_SIZE << 1)
|
|
#define WINDOW_MASK (WINDOW_SIZE - 1)
|
|
|
|
// The three kinds of block type
|
|
#define STORED_BLOCK 0
|
|
#define STATIC_TREES 1
|
|
#define DYN_TREES 2
|
|
#define MODE_ILLEGAL 3
|
|
|
|
// The minimum and maximum match lengths
|
|
#define MIN_MATCH 3
|
|
#define MAX_MATCH 258
|
|
|
|
// number of distance codes
|
|
#define D_CODES 30
|
|
|
|
extern const ulong extra_dbits[D_CODES];
|
|
|
|
// Structure to be used by external applications
|
|
|
|
// The application must update next_in and avail_in when avail_in has
|
|
// dropped to zero. It must update next_out and avail_out when avail_out
|
|
// has dropped to zero. All other fields are set by the
|
|
// compression library and must not be updated by the application.
|
|
|
|
typedef struct z_stream_s
|
|
{
|
|
byte *next_in; // next input unsigned char
|
|
ulong avail_in; // number of unsigned chars available at next_in
|
|
ulong total_in; // total number of bytes processed so far
|
|
|
|
byte *next_out; // next output unsigned char should be put there
|
|
ulong avail_out; // remaining free space at next_out
|
|
ulong total_out; // total number of bytes output
|
|
|
|
EStatus status;
|
|
EStatus error; // error code
|
|
|
|
struct inflate_state_s *istate; // not visible by applications
|
|
struct deflate_state_s *dstate; // not visible by applications
|
|
|
|
ulong quality;
|
|
} z_stream;
|
|
|
|
// 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
|
|
// for the crc. Pre- and post-conditioning (one's complement) is performed
|
|
// within this function so it shouldn't be done by the application.
|
|
// Usage example:
|
|
//
|
|
// ulong crc = crc32(0L, NULL, 0);
|
|
//
|
|
// while (read_buffer(buffer, length) != EOF) {
|
|
// crc = crc32(crc, buffer, length);
|
|
// }
|
|
// if (crc != original_crc) error();
|
|
|
|
ulong crc32(ulong crc, const byte *buf, ulong len);
|
|
|
|
// Update a running Adler-32 checksum with the bytes buf[0..len-1] and
|
|
// return the updated checksum. If buf is NULL, this function returns
|
|
// the required initial value for the checksum.
|
|
// An Adler-32 checksum is almost as reliable as a CRC32 but can be computed
|
|
// much faster. Usage example:
|
|
//
|
|
// ulong adler = adler32(0L, NULL, 0);
|
|
//
|
|
// while (read_buffer(buffer, length) != EOF) {
|
|
// adler = adler32(adler, buffer, length);
|
|
// }
|
|
// if (adler != original_adler) error();
|
|
|
|
ulong adler32(ulong adler, const byte *buf, ulong len);
|
|
|
|
// External calls to the deflate code
|
|
EStatus deflateInit(z_stream *strm, ELevel level, int noWrap = 0);
|
|
EStatus deflateCopy(z_stream *dest, z_stream *source);
|
|
EStatus deflate(z_stream *strm, EFlush flush);
|
|
EStatus deflateEnd(z_stream *strm);
|
|
const char *deflateError(void);
|
|
|
|
// External calls to the deflate code
|
|
EStatus inflateInit(z_stream *strm, EFlush flush, int noWrap = 0);
|
|
EStatus inflate(z_stream *z);
|
|
EStatus inflateEnd(z_stream *strm);
|
|
const char *inflateError(void);
|
|
|
|
// External calls to the zipfile code
|
|
bool InflateFile(byte *src, ulong compressedSize, byte *dst, ulong uncompressedSize, int noWrap = 0);
|
|
bool DeflateFile(byte *src, ulong uncompressedSize, byte *dst, ulong maxCompressedSize, ulong *compressedSize, ELevel level, int noWrap = 0);
|
|
|
|
// end
|