|
|
/* DEC/CMS REPLACEMENT HISTORY, Element CompPirv.H */ /* *1 14-NOV-1996 10:26:00 ANIGBOGU "[113914]Private declarations for all compression/decompression functions" */ /* DEC/CMS REPLACEMENT HISTORY, Element CompPirv.H */ /* PUBLIC FILE
****************************************************************************** ** ** (c) Copyright Schlumberger Technology Corp., unpublished work, created 1996. ** ** This computer program includes Confidential, Proprietary Information and is ** a Trade Secret of Schlumberger Technology Corp. All use, disclosure, and/or ** reproduction is prohibited unless authorized in writing by Schlumberger. ** All Rights Reserved. ** ****************************************************************************** ** ** compress/CompPirv.h ** ** PURPOSE ** ** Common declarations for all compression/decompression modules ** ** SPECIAL REQUIREMENTS & NOTES ** ** AUTHOR ** ** J. C. Anigbogu ** Austin Systems Center ** Nov 1996 ** ****************************************************************************** */
#include <stdio.h>
#include <stdlib.h>
#include "CompPub.h"
#include "slbCrc32.h"
#if defined(VMS)
#define OS_CODE 0x02
#endif
#if defined(Unix)
#define OS_CODE 0x03
#endif
/* Common defaults */
#ifndef OS_CODE
#define OS_CODE 0x0b /* assume WindowsNT or Windows95*/
#endif
#include <string.h>
#define memzero(String, Size) memset ((void *)(String), 0, (Size))
#define STORED 0
/* methods 1 to 7 reserved */ #define DEFLATED 8
#define MAX_METHODS 9
/*
* For compression, input is done in window[]. For decompression, output * is done in window. */
#ifndef INBUFSIZ
#define INBUFSIZ 0x8000 /* input buffer size */
#endif
#ifndef OUTBUFSIZ
#define OUTBUFSIZ 16384 /* output buffer size */
#endif
#ifndef DISTBUFSIZE
#define DISTBUFSIZE 0x8000 /* buffer for distances, see Trees.c */
#endif
#ifndef WSIZE
#define WSIZE 0x8000 /* window size--must be a power of two, and */
#endif /* at least 32K for zip's deflate method */
#ifndef DWSIZE
#define DWSIZE 0x10000 /* 2L * WSIZE */
#endif
#ifndef BITS
#define BITS 16
#endif
typedef struct CompData { unsigned char *Data; int Size; struct CompData *next; } CompData_t;
typedef struct CompParam { unsigned long InputSize; /* valid bytes in inbuf */ unsigned long Index; /* index of next byte to be processed in inbuf */ unsigned long OutBytes; /* bytes in output buffer */ unsigned long GlobalSize; /* bytes in inbut g_inbuf */ unsigned long BytesIn; /* number of input bytes */ unsigned long BytesOut; /* number of output bytes */ unsigned long HeaderBytes; /* number of bytes in gzip header */ unsigned long WindowSize; /* window size, 2*WSIZE */ Crc32 *pCRC; /* Cyclic Redundancy Check */ unsigned long BitBuffer; /* Global bit buffer */ unsigned int BitsInBitBuffer; /* bits in global bit buffer */ unsigned short DistBuffer[DISTBUFSIZE]; /* buffer for distances, see trees.c */ unsigned short HashLink[1L<<BITS]; /* hash link (see deflate.c) */ unsigned char InputBuffer[INBUFSIZ]; /* input buffer */ unsigned char *Input; /* pointer to input buffer */ unsigned char Output[OUTBUFSIZ]; /* output buffer */ unsigned char Window[DWSIZE]; /* Sliding window */ unsigned char *GlobalInput; /* global input buffer */ CompData_t *CompressedOutput; /* compressed output list */ CompData_t *PtrOutput; /* pointer to compressed output list */ } CompParam_t;
typedef struct DeflateParam { long BlockStart; unsigned int PrevLength; unsigned int StringStart; /* start of string to insert */ unsigned int MatchStart; /* start of matching string */ unsigned int MaxChainLength; unsigned int MaxLazyMatch; unsigned int GoodMatch; int NiceMatch; /* Stop searching when current match exceeds this */ } DeflateParam_t;
/* long BlockStart:
* window position at the beginning of the current output block. Gets * negative when the window is moved backwards. */
/* PrevLength:
* Length of the best match at previous step. Matches not greater than this * are discarded. This is used in the lazy match evaluation. */
/* MaxChainLength:
* To speed up deflation, hash chains are never searched beyond this length. * A higher limit improves compression ratio but degrades the speed. */
/* MaxLazyMatch:
* 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. */
/* GoodMatch: */ /* Use a faster search when the previous match is longer than this */
/* Values for MaxLazyMatch, GoodMatch and MaxChainLength, depending on
* the desired pack level (0..9). The values given below have been tuned to * exclude worst case performance for pathological data. Better values may be * found for specific data. */
/* ===========================================================================
* Data used by the "bit string" routines (Bits.c) and zip (Zip.c) */
typedef struct LocalBits { unsigned int BitBuffer; unsigned int ValidBits; } LocalBits_t;
/* BitBuffer: Output buffer. bits are inserted starting at the bottom
* (least significant bits). */ /* ValidBits: Number of valid bits in BitBuffer. All bits above the last valid bit
* are always zero. */
typedef struct LocalDef { unsigned int HashIndex; /* hash index of string to be inserted */ int EndOfInput; /* flag set at end of input buffer */ unsigned int Lookahead; /* number of valid bytes ahead in window */ int CompLevel; /* compression level (1..9) */ } LocalDef_t;
/* for compatibility with old zip sources (to be cleaned) */
#define GZIP_MAGIC "\037\213" /* Magic header for gzip format, 1F 8B */
#define MIN_MATCH 3
#define MAX_MATCH 258
/* The minimum and maximum match lengths */
#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 (WSIZE-MIN_LOOKAHEAD)
/* In order to simplify the code, particularly on 16 bit machines, match
* distances are limited to MAX_DIST instead of WSIZE. */
#define STORED_BLOCK 0
#define STATIC_TREES 1
#define DYN_TREES 2
/* The three kinds of block type */
#define GetByte(c) \
(c->Index < c->InputSize ? c->Input[c->Index++] : FillInputBuffer(0,c)) #define TryByte(c) \
(c->Index < c->InputSize ? c->Input[c->Index++] : FillInputBuffer(1,c))
/* PutByte is used for the compressed output
*/ #define PutByte(c,o) {o->Output[o->OutBytes++]=(unsigned char)(c); \
if (o->OutBytes==OUTBUFSIZ) \ FlushOutputBuffer(o);}
/* Output a 16 bit value, lsb first */ #define PutShort(w,c) \
{ if (c->OutBytes < OUTBUFSIZ-2) { \ c->Output[c->OutBytes++] = (unsigned char) ((w) & 0xff); \ c->Output[c->OutBytes++] = (unsigned char) ((unsigned short)(w) >> 8); \ } else { \ PutByte((unsigned char)((w) & 0xff),c); \ PutByte((unsigned char)((unsigned short)(w) >> 8),c); \ } \ }
/* Output a 32 bit value to the bit stream, LSB first */ #define PutLong(n,c) { \
PutShort(((n) & 0xffff),c); \ PutShort(((unsigned long)(n)) >> 16,c); \ }
/* Macros for getting two-byte and four-byte header values */ #define SH(p) ((unsigned short)(unsigned char)((p)[0]) | ((unsigned short)(unsigned char)((p)[1]) << 8))
#define LG(p) ((unsigned long)(SH(p)) | ((unsigned long)(SH((p)+2)) << 16))
/* Diagnostic functions */ #ifdef DEBUG
# define Assert(cond,msg) {if(!(cond)) error(msg);}
#else
# define Assert(cond,msg)
#endif
#ifndef MAX
#define MAX(a,b) (((a)>(b))?(a):(b))
#endif
#ifndef MIN
#define MIN(a,b) (((a)<(b))?(a):(b))
#endif
/* in Zip.c: */ extern CompressStatus_t Zip(int Level, CompParam_t *Comp); extern int FillBuffer(unsigned char *Buffer, unsigned int Size, CompParam_t *Comp); int ReadBuffer(char *Buffer, unsigned int Size, CompParam_t *Comp);
/* in Unzip.c */ extern CompressStatus_t Unzip(int Method, CompParam_t *Comp);
/* in Deflate.c */ CompressStatus_t InitLongestMatch(int PackLevel, unsigned short *Flags, DeflateParam_t *Defl, LocalDef_t *Deflt, CompParam_t *Comp); unsigned long Deflate(int Level, LocalBits_t *Bits, DeflateParam_t *Defl, LocalDef_t *Deflt, CompParam_t *Comp);
/* in Trees.c */ void InitMatchBuffer(void); int TallyFrequencies(int Dist, int LengthC, int Level, DeflateParam_t *Defl, CompParam_t *Comp); unsigned long FlushBlock(char *Buffer, unsigned long stored_len, int Eof, LocalBits_t *Bits, CompParam_t *Comp);
/* in Bits.c */ void InitializeBits(LocalBits_t *Bits); void SendBits(int Value, int Length, LocalBits_t *Bits, CompParam_t *Comp); unsigned int ReverseBits(unsigned int Value, int Length); void WindupBits(LocalBits_t *Bits, CompParam_t *Comp); void CopyBlock(char *Input, unsigned int Length, int Header, LocalBits_t *Bits, CompParam_t *Comp);
/* in Util.c: */ extern unsigned long UpdateCRC(CompParam_t *Comp, unsigned char *Input, unsigned int Size); extern void ClearBuffers(CompParam_t *Comp); extern int FillInputBuffer(int EOF_OK, CompParam_t *Comp); extern CompressStatus_t FlushOutputBuffer(CompParam_t *Comp); extern CompressStatus_t FlushWindow(CompParam_t *Comp); extern CompressStatus_t WriteBuffer(CompParam_t *Comp, void *Buffer, unsigned int Count);
/* in Inflate.c */ extern CompressStatus_t Inflate(CompParam_t *Comp);
|