| /* LzFind.h -- Match finder for LZ algorithms | 
 | 2009-04-22 : Igor Pavlov : Public domain */ | 
 |  | 
 | #ifndef __LZ_FIND_H | 
 | #define __LZ_FIND_H | 
 |  | 
 | #include "Types.h" | 
 |  | 
 | #ifdef __cplusplus | 
 | extern "C" { | 
 | #endif | 
 |  | 
 | typedef UInt32 CLzRef; | 
 |  | 
 | typedef struct _CMatchFinder | 
 | { | 
 |   Byte *buffer; | 
 |   UInt32 pos; | 
 |   UInt32 posLimit; | 
 |   UInt32 streamPos; | 
 |   UInt32 lenLimit; | 
 |  | 
 |   UInt32 cyclicBufferPos; | 
 |   UInt32 cyclicBufferSize; /* it must be = (historySize + 1) */ | 
 |  | 
 |   UInt32 matchMaxLen; | 
 |   CLzRef *hash; | 
 |   CLzRef *son; | 
 |   UInt32 hashMask; | 
 |   UInt32 cutValue; | 
 |  | 
 |   Byte *bufferBase; | 
 |   ISeqInStream *stream; | 
 |   int streamEndWasReached; | 
 |  | 
 |   UInt32 blockSize; | 
 |   UInt32 keepSizeBefore; | 
 |   UInt32 keepSizeAfter; | 
 |  | 
 |   UInt32 numHashBytes; | 
 |   int directInput; | 
 |   size_t directInputRem; | 
 |   int btMode; | 
 |   int bigHash; | 
 |   UInt32 historySize; | 
 |   UInt32 fixedHashSize; | 
 |   UInt32 hashSizeSum; | 
 |   UInt32 numSons; | 
 |   SRes result; | 
 |   UInt32 crc[256]; | 
 | } CMatchFinder; | 
 |  | 
 | #define Inline_MatchFinder_GetPointerToCurrentPos(p) ((p)->buffer) | 
 | #define Inline_MatchFinder_GetIndexByte(p, index) ((p)->buffer[(Int32)(index)]) | 
 |  | 
 | #define Inline_MatchFinder_GetNumAvailableBytes(p) ((p)->streamPos - (p)->pos) | 
 |  | 
 | int MatchFinder_NeedMove(CMatchFinder *p); | 
 | Byte *MatchFinder_GetPointerToCurrentPos(CMatchFinder *p); | 
 | void MatchFinder_MoveBlock(CMatchFinder *p); | 
 | void MatchFinder_ReadIfRequired(CMatchFinder *p); | 
 |  | 
 | void MatchFinder_Construct(CMatchFinder *p); | 
 |  | 
 | /* Conditions: | 
 |      historySize <= 3 GB | 
 |      keepAddBufferBefore + matchMaxLen + keepAddBufferAfter < 511MB | 
 | */ | 
 | int MatchFinder_Create(CMatchFinder *p, UInt32 historySize, | 
 |     UInt32 keepAddBufferBefore, UInt32 matchMaxLen, UInt32 keepAddBufferAfter, | 
 |     ISzAlloc *alloc); | 
 | void MatchFinder_Free(CMatchFinder *p, ISzAlloc *alloc); | 
 | void MatchFinder_Normalize3(UInt32 subValue, CLzRef *items, UInt32 numItems); | 
 | void MatchFinder_ReduceOffsets(CMatchFinder *p, UInt32 subValue); | 
 |  | 
 | UInt32 * GetMatchesSpec1(UInt32 lenLimit, UInt32 curMatch, UInt32 pos, const Byte *buffer, CLzRef *son, | 
 |     UInt32 _cyclicBufferPos, UInt32 _cyclicBufferSize, UInt32 _cutValue, | 
 |     UInt32 *distances, UInt32 maxLen); | 
 |  | 
 | /* | 
 | Conditions: | 
 |   Mf_GetNumAvailableBytes_Func must be called before each Mf_GetMatchLen_Func. | 
 |   Mf_GetPointerToCurrentPos_Func's result must be used only before any other function | 
 | */ | 
 |  | 
 | typedef void (*Mf_Init_Func)(void *object); | 
 | typedef Byte (*Mf_GetIndexByte_Func)(void *object, Int32 index); | 
 | typedef UInt32 (*Mf_GetNumAvailableBytes_Func)(void *object); | 
 | typedef const Byte * (*Mf_GetPointerToCurrentPos_Func)(void *object); | 
 | typedef UInt32 (*Mf_GetMatches_Func)(void *object, UInt32 *distances); | 
 | typedef void (*Mf_Skip_Func)(void *object, UInt32); | 
 |  | 
 | typedef struct _IMatchFinder | 
 | { | 
 |   Mf_Init_Func Init; | 
 |   Mf_GetIndexByte_Func GetIndexByte; | 
 |   Mf_GetNumAvailableBytes_Func GetNumAvailableBytes; | 
 |   Mf_GetPointerToCurrentPos_Func GetPointerToCurrentPos; | 
 |   Mf_GetMatches_Func GetMatches; | 
 |   Mf_Skip_Func Skip; | 
 | } IMatchFinder; | 
 |  | 
 | void MatchFinder_CreateVTable(CMatchFinder *p, IMatchFinder *vTable); | 
 |  | 
 | void MatchFinder_Init(CMatchFinder *p); | 
 | UInt32 Bt3Zip_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances); | 
 | UInt32 Hc3Zip_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances); | 
 | void Bt3Zip_MatchFinder_Skip(CMatchFinder *p, UInt32 num); | 
 | void Hc3Zip_MatchFinder_Skip(CMatchFinder *p, UInt32 num); | 
 |  | 
 | #ifdef __cplusplus | 
 | } | 
 | #endif | 
 |  | 
 | #endif |