* harbour/contrib/hbzlib
* replaced with the one borrowed from xharbour, source modifications by Przemek
* harbour/contrib/hbzlib/makefile
* harbour/contrib/hbzlib/makefile.bc
* harbour/contrib/hbzlib/makefile.vc
* harbour/contrib/hbzlib/zip.c
* harbour/contrib/hbzlib/include/zipfilemapping.h
* harbour/contrib/hbzlib/include/zipautobuffer.h
* harbour/contrib/hbzlib/include/hbzip2.h
* changed to make contrib/hbzlib working with harbour
+ harbour/contrib/hbzlib/hbcomprs.c
+ harbour/contrib/hbzlib/include/hbcomprs.h
+ added to make contrib/hbzlib working with harbour
+ harbour/contrib/hbzlib/doc
+ harbour/contrib/hbzlib/doc/zipnew.txt
+ added documentation borrowed from xharbour/doc/en
- harbour/contrib/hbzlib/BccW32.cfg
- removed unuseful file
1007 lines
33 KiB
C
1007 lines
33 KiB
C
/*
|
|
* $Id$
|
|
*/
|
|
|
|
/*
|
|
* xHarbour Project source code:
|
|
* Compression related functions
|
|
*
|
|
* Copyright 2003 Giancarlo Niccolai <giancarlo@niccolai.ws>
|
|
* www - http://www.xharbour.org
|
|
* SEE ALSO COPYRIGHT NOTICE FOR ZLIB BELOW.
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 2, or (at your option)
|
|
* any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this software; see the file COPYING. If not, write to
|
|
* the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
|
|
* Boston, MA 02111-1307 USA (or visit the web site http://www.gnu.org/).
|
|
*
|
|
* As a special exception, the Harbour Project gives permission for
|
|
* additional uses of the text contained in its release of Harbour.
|
|
*
|
|
* The exception is that, if you link the Harbour libraries with other
|
|
* files to produce an executable, this does not by itself cause the
|
|
* resulting executable to be covered by the GNU General Public License.
|
|
* Your use of that executable is in no way restricted on account of
|
|
* linking the Harbour library code into it.
|
|
*
|
|
* This exception does not however invalidate any other reasons why
|
|
* the executable file might be covered by the GNU General Public License.
|
|
*
|
|
* This exception applies only to the code released by the Harbour
|
|
* Project under the name Harbour. If you copy code from other
|
|
* Harbour Project or Free Software Foundation releases into a copy of
|
|
* Harbour, as the General Public License permits, the exception does
|
|
* not apply to the code that you add in this way. To avoid misleading
|
|
* anyone as to the status of such modified files, you must delete
|
|
* this exception notice from them.
|
|
*
|
|
* If you write modifications of your own for Harbour, it is your choice
|
|
* whether to permit this exception to apply to your modifications.
|
|
* If you do not wish that, delete this exception notice.
|
|
*
|
|
*/
|
|
|
|
/* This file is based upon ZLIB source code, whose copyright holder is:
|
|
*
|
|
* Copyright (C) 1995-2002 Jean-loup Gailly.
|
|
*
|
|
* Also, this file includes code slices from adler32.c for advanced CRC
|
|
* Holder of copyright for this code is:
|
|
*
|
|
* Copyright (C) 1995-2002 Mark Adler
|
|
*
|
|
* ZLIB (containing adler32 code) can be found at:
|
|
* http://www.gzip.org/zlib/
|
|
*/
|
|
|
|
#ifndef _HBCOMPRESS_H
|
|
#define _HBCOMPRESS_H
|
|
|
|
#include "hbdefs.h"
|
|
|
|
/*
|
|
#if _MSC_VER > 1000
|
|
#pragma warning (disable : 4131)
|
|
#pragma warning (disable : 4115)
|
|
#pragma warning (disable : 4127)
|
|
#pragma warning (disable : 4100)
|
|
#pragma warning (disable : 4244)
|
|
#pragma warning (disable : 4702)
|
|
#pragma warning (disable : 4206)
|
|
#pragma warning (disable : 4518)
|
|
#endif // _MSC_VER > 1000
|
|
*/
|
|
|
|
#if (defined(_WIN32) || defined(__WIN32__)) && !defined(WIN32)
|
|
# define WIN32
|
|
#endif
|
|
#if defined(__GNUC__) || defined(WIN32) || defined(__386__) || defined(i386)
|
|
# ifndef __32BIT__
|
|
# define __32BIT__
|
|
# endif
|
|
#endif
|
|
#if defined(__MSDOS__) && !defined(MSDOS)
|
|
# define MSDOS
|
|
#endif
|
|
|
|
/*
|
|
* Compile with -DMAXSEG_64K if the alloc function cannot allocate more
|
|
* than 64k bytes at a time (needed on systems with 16-bit int).
|
|
*/
|
|
#if defined(MSDOS) && !defined(__32BIT__)
|
|
# define MAXSEG_64K
|
|
#endif
|
|
#ifdef MSDOS
|
|
# define UNALIGNED_OK
|
|
#endif
|
|
|
|
#if (defined(MSDOS) || defined(_WINDOWS) || defined(WIN32)) && !defined(STDC)
|
|
# define STDC
|
|
#endif
|
|
#if defined(__STDC__) || defined(__cplusplus) || defined(__OS2__)
|
|
# ifndef STDC
|
|
# define STDC
|
|
# endif
|
|
#endif
|
|
|
|
#ifndef STDC
|
|
# ifndef const /* cannot use !defined(STDC) && !defined(const) on Mac */
|
|
# define const
|
|
# endif
|
|
#endif
|
|
|
|
/* Some Mac compilers merge all .h files incorrectly: */
|
|
#if defined(__MWERKS__) || defined(applec) ||defined(THINK_C) ||defined(__SC__)
|
|
# define NO_DUMMY_DECL
|
|
#endif
|
|
|
|
/* Old Borland C incorrectly complains about missing returns: */
|
|
#if defined(__BORLANDC__) && (__BORLANDC__ < 0x500)
|
|
# if !defined(NEED_DUMMY_RETURN)
|
|
# define NEED_DUMMY_RETURN
|
|
# endif
|
|
#endif
|
|
|
|
|
|
/* Maximum value for memLevel in deflateInit2 */
|
|
#ifndef MAX_MEM_LEVEL
|
|
# ifdef MAXSEG_64K
|
|
# define MAX_MEM_LEVEL 8
|
|
# else
|
|
# define MAX_MEM_LEVEL 9
|
|
# endif
|
|
#endif
|
|
|
|
/* 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
|
|
# define MAX_WBITS 15 /* 32K LZ77 window */
|
|
#endif
|
|
|
|
/* The memory requirements for deflate are (in bytes):
|
|
(1 << (windowBits+2)) + (1 << (memLevel+9))
|
|
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
|
|
the default memory requirements from 256K to 128K, compile with
|
|
make CFLAGS="-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7"
|
|
Of course this will generally degrade compression (there's no free lunch).
|
|
|
|
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.
|
|
*/
|
|
|
|
|
|
#ifndef OF /* function prototypes */
|
|
# ifdef STDC
|
|
# define OF(args) args
|
|
# else
|
|
# define OF(args) ()
|
|
# endif
|
|
#endif
|
|
|
|
/* The following definitions for FAR are needed only for MSDOS mixed
|
|
* model programming (small or medium model with some far allocations).
|
|
* This was tested only with MSC; for other MSDOS compilers you may have
|
|
* to define NO_MEMCPY in zutil.h. If you don't need the mixed model,
|
|
* just define FAR to be empty.
|
|
*/
|
|
#if (defined(M_I86SM) || defined(M_I86MM)) && !defined(__32BIT__)
|
|
/* MSC small or medium model */
|
|
# define SMALL_MEDIUM
|
|
# ifdef _MSC_VER
|
|
# define FAR _far
|
|
# else
|
|
# define FAR far
|
|
# endif
|
|
#endif
|
|
#if defined(__BORLANDC__) && (defined(__SMALL__) || defined(__MEDIUM__))
|
|
# ifndef __32BIT__
|
|
# define SMALL_MEDIUM
|
|
# define FAR _far
|
|
# endif
|
|
#endif
|
|
|
|
#ifndef FAR
|
|
# define FAR
|
|
#endif
|
|
|
|
#if !defined(MACOS) && !defined(TARGET_OS_MAC)
|
|
typedef BYTE Byte; /* 8 bits */
|
|
#endif
|
|
typedef UINT uInt; /* 16 bits or more */
|
|
typedef ULONG uLong; /* 32 bits or more */
|
|
|
|
#ifdef SMALL_MEDIUM
|
|
/* Borland C/C++ and some old MSC versions ignore FAR inside typedef */
|
|
# define Bytef Byte FAR
|
|
#else
|
|
typedef Byte FAR Bytef;
|
|
#endif
|
|
typedef char FAR charf;
|
|
typedef int FAR intf;
|
|
typedef uInt FAR uIntf;
|
|
typedef uLong FAR uLongf;
|
|
|
|
#ifdef STDC
|
|
typedef void FAR *voidpf;
|
|
typedef void *voidp;
|
|
#else
|
|
typedef Byte FAR *voidpf;
|
|
typedef Byte *voidp;
|
|
#endif
|
|
|
|
#ifdef HAVE_UNISTD_H
|
|
# include <sys/types.h> /* for off_t */
|
|
# include <unistd.h> /* for SEEK_* and off_t */
|
|
# define z_off_t off_t
|
|
#endif
|
|
#ifndef SEEK_SET
|
|
# define SEEK_SET 0 /* Seek from beginning of file. */
|
|
# define SEEK_CUR 1 /* Seek from current position. */
|
|
# define SEEK_END 2 /* Set file pointer to EOF plus "offset" */
|
|
#endif
|
|
#ifndef z_off_t
|
|
# define z_off_t long
|
|
#endif
|
|
|
|
|
|
//#ifdef __cplusplus
|
|
//extern "C" {
|
|
//#endif
|
|
|
|
#define ZLIB_VERSION "1.1.4"
|
|
|
|
struct internal_state;
|
|
struct inflate_internal_state;
|
|
|
|
typedef struct z_stream_s {
|
|
Bytef *next_in; /* next input byte */
|
|
uInt avail_in; /* number of bytes available at next_in */
|
|
uLong total_in; /* total nb of input bytes read so far */
|
|
|
|
Bytef *next_out; /* next output byte should be put there */
|
|
uInt avail_out; /* remaining free space at next_out */
|
|
uLong total_out; /* total nb of bytes output so far */
|
|
|
|
char *msg; /* last error message, NULL if no error */
|
|
struct internal_state FAR *state; /* not visible by applications */
|
|
struct inflate_internal_state FAR *inf_state; /* not visible by applications */
|
|
|
|
int data_type; /* best guess about the data type: ascii or binary */
|
|
uLong adler; /* adler32 value of the uncompressed data */
|
|
uLong reserved; /* reserved for future use */
|
|
} z_stream;
|
|
|
|
typedef z_stream FAR *z_streamp;
|
|
|
|
|
|
#define Z_NO_FLUSH 0
|
|
#define Z_PARTIAL_FLUSH 1 /* will be removed, use Z_SYNC_FLUSH instead */
|
|
#define Z_SYNC_FLUSH 2
|
|
#define Z_FULL_FLUSH 3
|
|
#define Z_FINISH 4
|
|
/* Allowed flush values; see deflate() below for details */
|
|
|
|
#define Z_OK 0
|
|
#define Z_STREAM_END 1
|
|
#define Z_NEED_DICT 2
|
|
#define Z_ERRNO (-1)
|
|
#define Z_STREAM_ERROR (-2)
|
|
#define Z_DATA_ERROR (-3)
|
|
#define Z_MEM_ERROR (-4)
|
|
#define Z_BUF_ERROR (-5)
|
|
#define Z_VERSION_ERROR (-6)
|
|
/* Return codes for the compression/decompression functions. Negative
|
|
* values are errors, positive values are used for special but normal events.
|
|
*/
|
|
|
|
#define Z_NO_COMPRESSION 0
|
|
#define Z_BEST_SPEED 1
|
|
#define Z_BEST_COMPRESSION 9
|
|
#define Z_DEFAULT_COMPRESSION (-1)
|
|
/* compression levels */
|
|
|
|
#define Z_FILTERED 1
|
|
#define Z_HUFFMAN_ONLY 2
|
|
#define Z_DEFAULT_STRATEGY 0
|
|
/* compression strategy; see deflateInit2() below for details */
|
|
|
|
#define Z_BINARY 0
|
|
#define Z_ASCII 1
|
|
#define Z_UNKNOWN 2
|
|
/* Possible values of the data_type field */
|
|
|
|
#define Z_DEFLATED 8
|
|
/* The deflate compression method (the only one supported in this version) */
|
|
|
|
#define zlib_version zlibVersion()
|
|
/* for compatibility with versions < 1.0.2 */
|
|
|
|
/* basic functions */
|
|
|
|
#define deflateInit(strm, level) \
|
|
deflateInit_((strm), (level), ZLIB_VERSION, sizeof(z_stream))
|
|
#define deflateInit2(strm, level, method, windowBits, memLevel, strategy) \
|
|
deflateInit2_((strm),(level),(method),(windowBits),(memLevel),\
|
|
(strategy), ZLIB_VERSION, sizeof(z_stream))
|
|
#define inflateInit(strm) \
|
|
inflateInit_((strm), ZLIB_VERSION, sizeof(z_stream))
|
|
#define inflateInit2(strm, windowBits) \
|
|
inflateInit2_((strm), (windowBits), ZLIB_VERSION, sizeof(z_stream))
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
extern uLong HB_EXPORT adler32 OF(( uLong adler, const BYTE *buf, UINT len));
|
|
extern uLong HB_EXPORT crc32 OF(( uLong crc, const BYTE *buf, uInt len));
|
|
extern int HB_EXPORT compress OF((Bytef *dest, uLongf *destLen,
|
|
const Bytef *source, uLong sourceLen,
|
|
int level));
|
|
extern int HB_EXPORT uncompress OF((Bytef *dest, uLongf *destLen,
|
|
const Bytef *source, uLong sourceLen));
|
|
|
|
HB_EXPORT extern const char * zlibVersion OF((void));
|
|
extern int HB_EXPORT deflate OF((z_streamp strm, int flush));
|
|
extern int HB_EXPORT deflateCopy OF((z_streamp dest, z_streamp source));
|
|
extern int HB_EXPORT deflateEnd OF((z_streamp strm));
|
|
extern int HB_EXPORT deflateInit_ OF(( z_streamp strm, int level, const char *version, int stream_size));
|
|
extern int HB_EXPORT deflateInit2_ OF((z_streamp strm, int level, int method,
|
|
int windowBits, int memLevel, int strategy,
|
|
const char * version, int stream_size));
|
|
extern int HB_EXPORT deflateParams OF((z_streamp strm,
|
|
int level, int strategy));
|
|
extern int HB_EXPORT deflateReset OF((z_streamp strm));
|
|
extern int HB_EXPORT deflateSetDictionary OF((z_streamp strm,
|
|
const Bytef *dictionary, uInt dictLength));
|
|
extern int HB_EXPORT inflate OF((z_streamp strm, int flush));
|
|
|
|
extern int HB_EXPORT inflateEnd OF((z_streamp strm));
|
|
extern int HB_EXPORT inflateInit_ OF((z_streamp z, const char *version, int stream_size));
|
|
extern int HB_EXPORT inflateInit2_ OF((z_streamp z, int w, const char *version, int stream_size));
|
|
extern int HB_EXPORT inflateReset OF((z_streamp strm));
|
|
extern int HB_EXPORT inflateSetDictionary OF((z_streamp strm,
|
|
const Bytef *dictionary, uInt dictLength));
|
|
|
|
HB_EXPORT extern const char * zError OF((int err));
|
|
HB_EXPORT extern const uLongf * get_crc_table OF((void));
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#include <stddef.h>
|
|
#ifndef local
|
|
# define local static
|
|
#endif
|
|
|
|
typedef unsigned char uch;
|
|
typedef uch FAR uchf;
|
|
typedef unsigned short ush;
|
|
typedef ush FAR ushf;
|
|
typedef unsigned long ulg;
|
|
|
|
extern const char *z_errmsg[10]; /* indexed by 2-zlib_error */
|
|
#define ERR_MSG(err) z_errmsg[Z_NEED_DICT-(err)]
|
|
#define ERR_RETURN(strm,err) \
|
|
return (strm->msg = (char*)ERR_MSG(err), (err))
|
|
|
|
/* common constants */
|
|
|
|
#ifndef DEF_WBITS
|
|
# define DEF_WBITS MAX_WBITS
|
|
#endif
|
|
/* default windowBits for decompression. MAX_WBITS is for compression only */
|
|
|
|
#if MAX_MEM_LEVEL >= 8
|
|
# define DEF_MEM_LEVEL 8
|
|
#else
|
|
# define DEF_MEM_LEVEL MAX_MEM_LEVEL
|
|
#endif
|
|
/* default memLevel */
|
|
|
|
#define STORED_BLOCK 0
|
|
#define STATIC_TREES 1
|
|
#define DYN_TREES 2
|
|
/* The three kinds of block type */
|
|
|
|
#define MIN_MATCH 3
|
|
#define MAX_MATCH 258
|
|
/* The minimum and maximum match lengths */
|
|
|
|
#define PRESET_DICT 0x20 /* preset dictionary flag in zlib header */
|
|
|
|
/* target dependencies */
|
|
|
|
#ifdef OS2
|
|
# define OS_CODE 0x06
|
|
#endif
|
|
|
|
#ifdef WIN32 /* Window 95 & Windows NT */
|
|
# define OS_CODE 0x0b
|
|
#endif
|
|
|
|
#if defined(VAXC) || defined(VMS)
|
|
# define OS_CODE 0x02
|
|
# define F_OPEN(name, mode) \
|
|
fopen((name), (mode), "mbc=60", "ctx=stm", "rfm=fix", "mrs=512")
|
|
#endif
|
|
|
|
#ifdef AMIGA
|
|
# define OS_CODE 0x01
|
|
#endif
|
|
|
|
#if defined(ATARI) || defined(atarist)
|
|
# define OS_CODE 0x05
|
|
#endif
|
|
|
|
#if defined(MACOS) || defined(TARGET_OS_MAC)
|
|
# 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
|
|
|
|
#ifdef __50SERIES /* Prime/PRIMOS */
|
|
# define OS_CODE 0x0F
|
|
#endif
|
|
|
|
#ifdef TOPS20
|
|
# define OS_CODE 0x0a
|
|
#endif
|
|
|
|
#if defined(_BEOS_) || defined(RISCOS)
|
|
# define fdopen(fd,mode) NULL /* No fdopen() */
|
|
#endif
|
|
|
|
#if (defined(_MSC_VER) && (_MSC_VER > 600))
|
|
# define fdopen(fd,type) _fdopen(fd,type)
|
|
#endif
|
|
|
|
|
|
/* Common defaults */
|
|
|
|
#ifndef OS_CODE
|
|
# define OS_CODE 0x03 /* assume Unix */
|
|
#endif
|
|
|
|
#ifndef F_OPEN
|
|
# define F_OPEN(name, mode) fopen((name), (mode))
|
|
#endif
|
|
|
|
/* functions */
|
|
|
|
#ifdef HAVE_STRERROR
|
|
extern char *strerror OF((int));
|
|
# define zstrerror(errnum) strerror(errnum)
|
|
#else
|
|
# define zstrerror(errnum) ""
|
|
#endif
|
|
|
|
typedef ULONG (*check_func) OF((uLong check, const BYTE *buf, UINT len));
|
|
|
|
#define TRY_FREE(p) {if (p) hb_xfree(p);}
|
|
|
|
/* ===========================================================================
|
|
* Internal compression state.
|
|
*/
|
|
|
|
#define LENGTH_CODES 29
|
|
/* number of length codes, not counting the special END_BLOCK code */
|
|
|
|
#define LITERALS 256
|
|
/* number of literal bytes 0..255 */
|
|
|
|
#define L_CODES (LITERALS+1+LENGTH_CODES)
|
|
/* number of Literal or Length codes, including the END_BLOCK code */
|
|
|
|
#define D_CODES 30
|
|
/* number of distance codes */
|
|
|
|
#define BL_CODES 19
|
|
/* number of codes used to transfer the bit lengths */
|
|
|
|
#define HEAP_SIZE (2*L_CODES+1)
|
|
/* maximum heap size */
|
|
|
|
#define MAX_BITS 15
|
|
/* All codes must not exceed MAX_BITS bits */
|
|
|
|
#define INIT_STATE 42
|
|
#define BUSY_STATE 113
|
|
#define FINISH_STATE 666
|
|
/* Stream status */
|
|
|
|
|
|
/* Data structure describing a single value and its code string. */
|
|
typedef struct ct_data_s {
|
|
union {
|
|
ush freq; /* frequency count */
|
|
ush code; /* bit string */
|
|
} fc;
|
|
union {
|
|
ush dad; /* father node in Huffman tree */
|
|
ush len; /* length of bit string */
|
|
} dl;
|
|
} FAR ct_data;
|
|
|
|
struct static_tree_desc_s {
|
|
const ct_data *static_tree; /* static tree or NULL */
|
|
const intf *extra_bits; /* extra bits for each code or NULL */
|
|
int extra_base; /* base index for extra_bits */
|
|
int elems; /* max number of elements in the tree */
|
|
int max_length; /* max bit length for the codes */
|
|
};
|
|
|
|
typedef struct static_tree_desc_s static_tree_desc;
|
|
|
|
typedef struct tree_desc_s {
|
|
ct_data *dyn_tree; /* the dynamic tree */
|
|
int max_code; /* largest code with non zero frequency */
|
|
static_tree_desc *stat_desc; /* the corresponding static tree */
|
|
} FAR tree_desc;
|
|
|
|
typedef ush Pos;
|
|
typedef Pos FAR Posf;
|
|
typedef unsigned IPos;
|
|
|
|
/* A Pos is an index in the character window. We use short instead of int to
|
|
* save space in the various tables. IPos is used only for parameter passing.
|
|
*/
|
|
|
|
typedef struct internal_state {
|
|
z_streamp strm; /* pointer back to this zlib stream */
|
|
int status; /* as the name implies */
|
|
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 */
|
|
int pending; /* nb of bytes in the pending buffer */
|
|
int noheader; /* suppress zlib header and adler32 */
|
|
Byte data_type; /* UNKNOWN, BINARY or ASCII */
|
|
Byte method; /* STORED (for zip only) or DEFLATED */
|
|
int last_flush; /* value of flush param for previous deflate call */
|
|
|
|
/* used by deflate.c: */
|
|
|
|
uInt w_size; /* LZ77 window size (32K by default) */
|
|
uInt w_bits; /* log2(w_size) (8..16) */
|
|
uInt w_mask; /* w_size - 1 */
|
|
|
|
Bytef *window;
|
|
/* Sliding window. Input bytes are read into the second half of the window,
|
|
* and move to the first half later to keep a dictionary of at least wSize
|
|
* bytes. With this organization, matches are limited to a distance of
|
|
* wSize-MAX_MATCH bytes, but this ensures that IO is always
|
|
* performed with a length multiple of the block size. Also, it limits
|
|
* the window size to 64K, which is quite useful on MSDOS.
|
|
* To do: use the user input buffer as sliding window.
|
|
*/
|
|
|
|
ulg window_size;
|
|
/* Actual size of window: 2*wSize, except when the user input buffer
|
|
* is directly used as sliding window.
|
|
*/
|
|
|
|
Posf *prev;
|
|
/* Link to older string with same hash index. To limit the size of this
|
|
* array to 64K, this link is maintained only for the last 32K strings.
|
|
* An index in this array is thus a window index modulo 32K.
|
|
*/
|
|
|
|
Posf *head; /* Heads of the hash chains or NIL. */
|
|
|
|
uInt ins_h; /* hash index of string to be inserted */
|
|
uInt hash_size; /* number of elements in hash table */
|
|
uInt hash_bits; /* log2(hash_size) */
|
|
uInt hash_mask; /* hash_size-1 */
|
|
|
|
uInt hash_shift;
|
|
/* Number of bits by which ins_h must be shifted at each input
|
|
* step. It must be such that after MIN_MATCH steps, the oldest
|
|
* byte no longer takes part in the hash key, that is:
|
|
* hash_shift * MIN_MATCH >= hash_bits
|
|
*/
|
|
|
|
long block_start;
|
|
/* Window position at the beginning of the current output block. Gets
|
|
* negative when the window is moved backwards.
|
|
*/
|
|
|
|
uInt match_length; /* length of best match */
|
|
IPos prev_match; /* previous match */
|
|
int match_available; /* set if previous match exists */
|
|
uInt strstart; /* start of string to insert */
|
|
uInt match_start; /* start of matching string */
|
|
uInt lookahead; /* number of valid bytes ahead in window */
|
|
|
|
uInt prev_length;
|
|
/* Length of the best match at previous step. Matches not greater than this
|
|
* are discarded. This is used in the lazy match evaluation.
|
|
*/
|
|
|
|
uInt max_chain_length;
|
|
/* To speed up deflation, hash chains are never searched beyond this
|
|
* length. A higher limit improves compression ratio but degrades the
|
|
* speed.
|
|
*/
|
|
|
|
uInt max_lazy_match;
|
|
/* Attempt to find a better match only when the current match is strictly
|
|
* smaller than this value. This mechanism is used only for compression
|
|
* levels >= 4.
|
|
*/
|
|
# define max_insert_length max_lazy_match
|
|
/* Insert new strings in the hash table only if the match length is not
|
|
* greater than this length. This saves time but degrades compression.
|
|
* max_insert_length is used only for compression levels <= 3.
|
|
*/
|
|
|
|
int level; /* compression level (1..9) */
|
|
int strategy; /* favor or force Huffman coding*/
|
|
|
|
uInt good_match;
|
|
/* Use a faster search when the previous match is longer than this */
|
|
|
|
int nice_match; /* Stop searching when current match exceeds this */
|
|
|
|
/* used by trees.c: */
|
|
/* Didn't use ct_data typedef below to supress compiler warning */
|
|
struct ct_data_s dyn_ltree[HEAP_SIZE]; /* literal and length tree */
|
|
struct ct_data_s dyn_dtree[2*D_CODES+1]; /* distance tree */
|
|
struct ct_data_s bl_tree[2*BL_CODES+1]; /* Huffman tree for bit lengths */
|
|
|
|
struct tree_desc_s l_desc; /* desc. for literal tree */
|
|
struct tree_desc_s d_desc; /* desc. for distance tree */
|
|
struct tree_desc_s bl_desc; /* desc. for bit length tree */
|
|
|
|
ush bl_count[MAX_BITS+1];
|
|
/* number of codes at each bit length for an optimal tree */
|
|
|
|
int heap[2*L_CODES+1]; /* heap used to build the Huffman trees */
|
|
int heap_len; /* number of elements in the heap */
|
|
int heap_max; /* element of largest frequency */
|
|
/* The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used.
|
|
* The same heap array is used to build all trees.
|
|
*/
|
|
|
|
uch depth[2*L_CODES+1];
|
|
/* Depth of each subtree used as tie breaker for trees of equal frequency
|
|
*/
|
|
|
|
uchf *l_buf; /* buffer for literals or lengths */
|
|
uInt lit_bufsize; /* Size of match buffer for literals/lengths. */
|
|
uInt last_lit; /* running index in l_buf */
|
|
|
|
ushf *d_buf;
|
|
/* Buffer for distances. To simplify the code, d_buf and l_buf have
|
|
* the same number of elements. To use different lengths, an extra flag
|
|
* array would be necessary.
|
|
*/
|
|
|
|
ulg opt_len; /* bit length of current block with optimal trees */
|
|
ulg static_len; /* bit length of current block with static trees */
|
|
uInt matches; /* number of string matches in current block */
|
|
int last_eob_len; /* bit length of EOB code for last block */
|
|
|
|
ush bi_buf;
|
|
/* Output buffer. bits are inserted starting at the bottom (least
|
|
* significant bits).
|
|
*/
|
|
int bi_valid;
|
|
/* Number of valid bits in bi_buf. All bits above the last valid bit
|
|
* are always zero.
|
|
*/
|
|
|
|
} FAR deflate_state;
|
|
|
|
|
|
/* Output a byte on the stream.
|
|
* IN assertion: there is enough room in pending_buf.
|
|
*/
|
|
#define put_byte(s, c) {s->pending_buf[s->pending++] = (c);}
|
|
|
|
|
|
#define MIN_LOOKAHEAD (MAX_MATCH+MIN_MATCH+1)
|
|
/* Minimum amount of lookahead, except at the end of the input file.
|
|
* See deflate.c for comments about the MIN_MATCH+1.
|
|
*/
|
|
|
|
#define MAX_DIST(s) ((s)->w_size-MIN_LOOKAHEAD)
|
|
/* In order to simplify the code, particularly on 16 bit machines, match
|
|
* distances are limited to MAX_DIST instead of WSIZE.
|
|
*/
|
|
|
|
/* in trees.c */
|
|
void _tr_init OF((deflate_state *s));
|
|
int _tr_tally OF((deflate_state *s, unsigned dist, unsigned lc));
|
|
void _tr_flush_block OF((deflate_state *s, charf *buf, ulg stored_len,
|
|
int eof));
|
|
void _tr_align OF((deflate_state *s));
|
|
void _tr_stored_block OF((deflate_state *s, charf *buf, ulg stored_len,
|
|
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.
|
|
*/
|
|
|
|
# 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_lit_2(s, c ) \
|
|
{ uch cc = (c); \
|
|
s->d_buf[s->last_lit] = 0; \
|
|
s->l_buf[s->last_lit++] = cc; \
|
|
s->dyn_ltree[cc].Freq++; \
|
|
}
|
|
# 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); \
|
|
}
|
|
|
|
|
|
/* header created automatically with -DGEN_TREES_H */
|
|
#define DIST_CODE_LEN 512 /* see definition of array dist_code below */
|
|
|
|
|
|
/* infblock.h -- header to use infblock.c
|
|
* Copyright (C) 1995-2002 Mark Adler
|
|
* For conditions of distribution and use, see copyright notice in zlib.h
|
|
*/
|
|
|
|
|
|
struct inflate_huft_s {
|
|
union {
|
|
struct {
|
|
Byte Exop; /* number of extra bits or operation */
|
|
Byte Bits; /* number of bits in this code or subcode */
|
|
} what;
|
|
uInt pad; /* pad structure to a power of 2 (4 bytes for */
|
|
} word; /* 16-bit, 8 bytes for 32-bit int's) */
|
|
uInt base; /* literal, length base, distance base,
|
|
or table offset */
|
|
};
|
|
typedef struct inflate_huft_s FAR inflate_huft;
|
|
|
|
struct inflate_codes_state;
|
|
typedef struct inflate_codes_state FAR inflate_codes_statef;
|
|
|
|
/* Maximum size of dynamic tree. The maximum found in a long but non-
|
|
exhaustive search was 1004 huft structures (850 for length/literals
|
|
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((
|
|
uIntf *, /* 19 code lengths */
|
|
uIntf *, /* bits tree desired/actual depth */
|
|
inflate_huft * FAR *, /* bits tree result */
|
|
inflate_huft *, /* space for trees */
|
|
z_streamp)); /* for messages */
|
|
|
|
extern int inflate_trees_dynamic OF((
|
|
uInt, /* number of literal/length codes */
|
|
uInt, /* number of distance codes */
|
|
uIntf *, /* that many (total) code lengths */
|
|
uIntf *, /* literal desired/actual bit depth */
|
|
uIntf *, /* distance desired/actual bit depth */
|
|
inflate_huft * FAR *, /* literal/length tree result */
|
|
inflate_huft * FAR *, /* distance tree result */
|
|
inflate_huft *, /* space for trees */
|
|
z_streamp)); /* for messages */
|
|
|
|
#ifdef BUILDFIXED
|
|
extern int inflate_trees_fixed OF((
|
|
uIntf *, /* literal desired/actual bit depth */
|
|
uIntf *, /* distance desired/actual bit depth */
|
|
inflate_huft * FAR *, /* literal/length tree result */
|
|
inflate_huft * FAR * /* distance tree result */
|
|
, z_streamp)); /* for memory allocation */
|
|
#else
|
|
extern int inflate_trees_fixed OF((
|
|
uIntf *, /* literal desired/actual bit depth */
|
|
uIntf *, /* distance desired/actual bit depth */
|
|
inflate_huft * FAR *, /* literal/length tree result */
|
|
inflate_huft * FAR *));
|
|
|
|
#endif
|
|
|
|
/* WARNING: this file should *not* be used by applications. It is
|
|
part of the implementation of the compression library and is
|
|
subject to change. Applications should only use zlib.h.
|
|
*/
|
|
|
|
typedef enum {
|
|
TYPE, /* get type bits (3, including end bit) */
|
|
LENS, /* get lengths for stored */
|
|
STORED, /* processing stored block */
|
|
TABLE, /* get table lengths */
|
|
BTREE, /* get bit lengths tree for a dynamic block */
|
|
DTREE, /* get length, distance trees for a dynamic block */
|
|
CODES, /* processing fixed or dynamic block */
|
|
DRY, /* output remaining window bytes */
|
|
BLOCK_DONE, /* finished last block, done */
|
|
BLOCK_BAD} /* got a data error--stuck here */
|
|
inflate_block_mode;
|
|
|
|
/* inflate blocks semi-private state */
|
|
struct inflate_blocks_state {
|
|
|
|
/* mode */
|
|
inflate_block_mode mode; /* current inflate_block mode */
|
|
|
|
/* mode dependent information */
|
|
union {
|
|
uInt left; /* if STORED, bytes left to copy */
|
|
struct {
|
|
uInt table; /* table lengths (14 bits) */
|
|
uInt index; /* index into blens (or border) */
|
|
uIntf *blens; /* bit lengths of codes */
|
|
uInt bb; /* bit length tree depth */
|
|
inflate_huft *tb; /* bit length decoding tree */
|
|
} trees; /* if DTREE, decoding info for trees */
|
|
struct {
|
|
inflate_codes_statef
|
|
*codes;
|
|
} decode; /* if CODES, current state */
|
|
} sub; /* submode */
|
|
uInt last; /* true if this block is the last block */
|
|
|
|
/* mode independent information */
|
|
uInt bitk; /* bits in bit buffer */
|
|
uLong bitb; /* bit buffer */
|
|
inflate_huft *hufts; /* single malloc for tree space */
|
|
Bytef *window; /* sliding window */
|
|
Bytef *end; /* one byte after sliding window */
|
|
Bytef *read; /* window read pointer */
|
|
Bytef *write; /* window write pointer */
|
|
check_func checkfn; /* check function */
|
|
uLong check; /* check on output */
|
|
|
|
};
|
|
|
|
|
|
/* defines for inflate input/output */
|
|
/* update pointers and return */
|
|
#define UPDBITS {s->bitb=b;s->bitk=k;}
|
|
#define UPDIN {z->avail_in=n;z->total_in+=p-z->next_in;z->next_in=p;}
|
|
#define UPDOUT {s->write=q;}
|
|
#define UPDATE {UPDBITS UPDIN UPDOUT}
|
|
#define LEAVE {UPDATE return inflate_flush(s,z,r);}
|
|
/* get bytes and bits */
|
|
#define LOADIN {p=z->next_in;n=z->avail_in;b=s->bitb;k=s->bitk;}
|
|
#define NEEDBYTE {if(n)r=Z_OK;else LEAVE}
|
|
#define NEXTBYTE (n--,*p++)
|
|
#define NEEDBITS(j) {while(k<(j)){NEEDBYTE;b|=((uLong)NEXTBYTE)<<k;k+=8;}}
|
|
#define DUMPBITS(j) {b>>=(j);k-=(j);}
|
|
/* output bytes */
|
|
#define WAVAIL (uInt)(q<s->read?s->read-q-1:s->end-q)
|
|
#define LOADOUT {q=s->write;m=(uInt)WAVAIL;}
|
|
#define WRAP {if(q==s->end&&s->read!=s->window){q=s->window;m=(uInt)WAVAIL;}}
|
|
#define FLUSH {UPDOUT r=inflate_flush(s,z,r); LOADOUT}
|
|
#define FLUSH_2 {UPDOUT r=inflate_flush(s,z,r); q=s->write;}
|
|
#define NEEDOUT {if(m==0){WRAP if(m==0){FLUSH WRAP if(m==0) LEAVE}}r=Z_OK;}
|
|
#define OUTBYTE(a) {*q++=(Byte)(a);m--;}
|
|
/* load local pointers */
|
|
#define LOAD {LOADIN LOADOUT}
|
|
|
|
#define INF_NEEDBYTE {if(z->avail_in==0)return r;r=f;}
|
|
#define INF_NEEDBYTE_2 {if(z->avail_in==0)return r;}
|
|
#define INF_NEXTBYTE (z->avail_in--,z->total_in++,*z->next_in++)
|
|
|
|
/* masks for lower bits (size given to avoid silly warnings with Visual C++) */
|
|
extern uInt inflate_mask[17];
|
|
|
|
typedef struct inflate_blocks_state FAR inflate_blocks_statef;
|
|
|
|
extern inflate_blocks_statef * inflate_blocks_new OF((
|
|
z_streamp z,
|
|
check_func c, /* check function */
|
|
uInt w)); /* window size */
|
|
|
|
extern int inflate_blocks OF((
|
|
inflate_blocks_statef *,
|
|
z_streamp ,
|
|
int)); /* initial return code */
|
|
|
|
extern void inflate_blocks_reset OF((
|
|
inflate_blocks_statef *,
|
|
z_streamp ,
|
|
uLongf *)); /* check value on output */
|
|
|
|
extern int inflate_blocks_free OF((
|
|
inflate_blocks_statef *,
|
|
z_streamp));
|
|
|
|
extern void inflate_set_dictionary OF((
|
|
inflate_blocks_statef *s,
|
|
const Bytef *d, /* dictionary */
|
|
uInt n)); /* dictionary length */
|
|
|
|
extern int inflate_blocks_sync_point OF((
|
|
inflate_blocks_statef *s));
|
|
|
|
extern inflate_codes_statef *inflate_codes_new OF((
|
|
uInt, uInt,
|
|
inflate_huft *, inflate_huft *,
|
|
z_streamp ));
|
|
|
|
extern int inflate_codes OF((
|
|
inflate_blocks_statef *,
|
|
z_streamp ,
|
|
int));
|
|
|
|
extern void inflate_codes_free OF((
|
|
inflate_codes_statef *,
|
|
z_streamp ));
|
|
|
|
/* copy as much as possible from the sliding window to the output area */
|
|
extern int inflate_flush OF((
|
|
inflate_blocks_statef *,
|
|
z_streamp ,
|
|
int));
|
|
|
|
|
|
typedef enum {
|
|
METHOD, /* waiting for method byte */
|
|
FLAG, /* waiting for flag byte */
|
|
DICT4, /* four dictionary check bytes to go */
|
|
DICT3, /* three dictionary check bytes to go */
|
|
DICT2, /* two dictionary check bytes to go */
|
|
DICT1, /* one dictionary check byte to go */
|
|
DICT0, /* waiting for inflateSetDictionary */
|
|
BLOCKS, /* decompressing blocks */
|
|
CHECK4, /* four check bytes to go */
|
|
CHECK3, /* three check bytes to go */
|
|
CHECK2, /* two check bytes to go */
|
|
CHECK1, /* one check byte to go */
|
|
DONE, /* finished check, done */
|
|
BAD} /* got an error--stay here */
|
|
inflate_mode;
|
|
|
|
/* inflate private state */
|
|
struct inflate_internal_state {
|
|
|
|
/* mode */
|
|
inflate_mode mode; /* current inflate mode */
|
|
|
|
/* mode dependent information */
|
|
union {
|
|
uInt method; /* if FLAGS, method byte */
|
|
struct {
|
|
uLong was; /* computed check value */
|
|
uLong need; /* stream check value */
|
|
} check; /* if CHECK, check values to compare */
|
|
uInt marker; /* if BAD, inflateSync's marker bytes count */
|
|
} sub; /* submode */
|
|
|
|
/* mode independent information */
|
|
int nowrap; /* flag for no wrapper */
|
|
uInt wbits; /* log2(window size) (8..15, defaults to 15) */
|
|
inflate_blocks_statef
|
|
*blocks; /* current inflate_blocks state */
|
|
|
|
};
|
|
|
|
extern int inflate_fast(uInt bl, uInt bd, inflate_huft *tl, inflate_huft *td,
|
|
inflate_blocks_statef *s, z_streamp z);
|
|
|
|
|
|
//#ifdef __cplusplus
|
|
//};
|
|
//#endif
|
|
|
|
#endif
|
|
|