Subversion Repositories Games.Chess Giants

Rev

Blame | Last modification | View Log | Download | RSS feed

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