/* 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 #include #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 #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<= 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);