Blame | Last modification | View Log | RSS feed
/* LzFind.h -- Match finder for LZ algorithms2008-10-04 : Igor Pavlov : Public domain */#ifndef __LZFIND_H#define __LZFIND_H#include "Types.h"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;int btMode;/* int skipModeBits; */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 GBkeepAddBufferBefore + 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);#endif