LzFind.h revision 5821806d5e7f356e8fa4b058a389a808ea183019
1/* LzFind.h -- Match finder for LZ algorithms 22009-04-22 : Igor Pavlov : Public domain */ 3 4#ifndef __LZ_FIND_H 5#define __LZ_FIND_H 6 7#include "Types.h" 8 9#ifdef __cplusplus 10extern "C" { 11#endif 12 13typedef UInt32 CLzRef; 14 15typedef struct _CMatchFinder 16{ 17 Byte *buffer; 18 UInt32 pos; 19 UInt32 posLimit; 20 UInt32 streamPos; 21 UInt32 lenLimit; 22 23 UInt32 cyclicBufferPos; 24 UInt32 cyclicBufferSize; /* it must be = (historySize + 1) */ 25 26 UInt32 matchMaxLen; 27 CLzRef *hash; 28 CLzRef *son; 29 UInt32 hashMask; 30 UInt32 cutValue; 31 32 Byte *bufferBase; 33 ISeqInStream *stream; 34 int streamEndWasReached; 35 36 UInt32 blockSize; 37 UInt32 keepSizeBefore; 38 UInt32 keepSizeAfter; 39 40 UInt32 numHashBytes; 41 int directInput; 42 size_t directInputRem; 43 int btMode; 44 int bigHash; 45 UInt32 historySize; 46 UInt32 fixedHashSize; 47 UInt32 hashSizeSum; 48 UInt32 numSons; 49 SRes result; 50 UInt32 crc[256]; 51} CMatchFinder; 52 53#define Inline_MatchFinder_GetPointerToCurrentPos(p) ((p)->buffer) 54#define Inline_MatchFinder_GetIndexByte(p, index) ((p)->buffer[(Int32)(index)]) 55 56#define Inline_MatchFinder_GetNumAvailableBytes(p) ((p)->streamPos - (p)->pos) 57 58int MatchFinder_NeedMove(CMatchFinder *p); 59Byte *MatchFinder_GetPointerToCurrentPos(CMatchFinder *p); 60void MatchFinder_MoveBlock(CMatchFinder *p); 61void MatchFinder_ReadIfRequired(CMatchFinder *p); 62 63void MatchFinder_Construct(CMatchFinder *p); 64 65/* Conditions: 66 historySize <= 3 GB 67 keepAddBufferBefore + matchMaxLen + keepAddBufferAfter < 511MB 68*/ 69int MatchFinder_Create(CMatchFinder *p, UInt32 historySize, 70 UInt32 keepAddBufferBefore, UInt32 matchMaxLen, UInt32 keepAddBufferAfter, 71 ISzAlloc *alloc); 72void MatchFinder_Free(CMatchFinder *p, ISzAlloc *alloc); 73void MatchFinder_Normalize3(UInt32 subValue, CLzRef *items, UInt32 numItems); 74void MatchFinder_ReduceOffsets(CMatchFinder *p, UInt32 subValue); 75 76UInt32 * GetMatchesSpec1(UInt32 lenLimit, UInt32 curMatch, UInt32 pos, const Byte *buffer, CLzRef *son, 77 UInt32 _cyclicBufferPos, UInt32 _cyclicBufferSize, UInt32 _cutValue, 78 UInt32 *distances, UInt32 maxLen); 79 80/* 81Conditions: 82 Mf_GetNumAvailableBytes_Func must be called before each Mf_GetMatchLen_Func. 83 Mf_GetPointerToCurrentPos_Func's result must be used only before any other function 84*/ 85 86typedef void (*Mf_Init_Func)(void *object); 87typedef Byte (*Mf_GetIndexByte_Func)(void *object, Int32 index); 88typedef UInt32 (*Mf_GetNumAvailableBytes_Func)(void *object); 89typedef const Byte * (*Mf_GetPointerToCurrentPos_Func)(void *object); 90typedef UInt32 (*Mf_GetMatches_Func)(void *object, UInt32 *distances); 91typedef void (*Mf_Skip_Func)(void *object, UInt32); 92 93typedef struct _IMatchFinder 94{ 95 Mf_Init_Func Init; 96 Mf_GetIndexByte_Func GetIndexByte; 97 Mf_GetNumAvailableBytes_Func GetNumAvailableBytes; 98 Mf_GetPointerToCurrentPos_Func GetPointerToCurrentPos; 99 Mf_GetMatches_Func GetMatches; 100 Mf_Skip_Func Skip; 101} IMatchFinder; 102 103void MatchFinder_CreateVTable(CMatchFinder *p, IMatchFinder *vTable); 104 105void MatchFinder_Init(CMatchFinder *p); 106UInt32 Bt3Zip_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances); 107UInt32 Hc3Zip_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances); 108void Bt3Zip_MatchFinder_Skip(CMatchFinder *p, UInt32 num); 109void Hc3Zip_MatchFinder_Skip(CMatchFinder *p, UInt32 num); 110 111#ifdef __cplusplus 112} 113#endif 114 115#endif 116