mirror of
				https://github.com/RetroDECK/Duckstation.git
				synced 2025-04-10 19:15:14 +00:00 
			
		
		
		
	
		
			
	
	
		
			122 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			122 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
|   | /* LzFind.h -- Match finder for LZ algorithms
 | ||
|  | 2017-06-10 : Igor Pavlov : Public domain */ | ||
|  | 
 | ||
|  | #ifndef __LZ_FIND_H
 | ||
|  | #define __LZ_FIND_H
 | ||
|  | 
 | ||
|  | #include "7zTypes.h"
 | ||
|  | 
 | ||
|  | EXTERN_C_BEGIN | ||
|  | 
 | ||
|  | 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) */ | ||
|  | 
 | ||
|  |   Byte streamEndWasReached; | ||
|  |   Byte btMode; | ||
|  |   Byte bigHash; | ||
|  |   Byte directInput; | ||
|  | 
 | ||
|  |   UInt32 matchMaxLen; | ||
|  |   CLzRef *hash; | ||
|  |   CLzRef *son; | ||
|  |   UInt32 hashMask; | ||
|  |   UInt32 cutValue; | ||
|  | 
 | ||
|  |   Byte *bufferBase; | ||
|  |   ISeqInStream *stream; | ||
|  |    | ||
|  |   UInt32 blockSize; | ||
|  |   UInt32 keepSizeBefore; | ||
|  |   UInt32 keepSizeAfter; | ||
|  | 
 | ||
|  |   UInt32 numHashBytes; | ||
|  |   size_t directInputRem; | ||
|  |   UInt32 historySize; | ||
|  |   UInt32 fixedHashSize; | ||
|  |   UInt32 hashSizeSum; | ||
|  |   SRes result; | ||
|  |   UInt32 crc[256]; | ||
|  |   size_t numRefs; | ||
|  | 
 | ||
|  |   UInt64 expectedDataSize; | ||
|  | } CMatchFinder; | ||
|  | 
 | ||
|  | #define Inline_MatchFinder_GetPointerToCurrentPos(p) ((p)->buffer)
 | ||
|  | 
 | ||
|  | #define Inline_MatchFinder_GetNumAvailableBytes(p) ((p)->streamPos - (p)->pos)
 | ||
|  | 
 | ||
|  | #define Inline_MatchFinder_IsFinishedOK(p) \
 | ||
|  |     ((p)->streamEndWasReached \ | ||
|  |         && (p)->streamPos == (p)->pos \ | ||
|  |         && (!(p)->directInput || (p)->directInputRem == 0)) | ||
|  |        | ||
|  | 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, | ||
|  |     ISzAllocPtr alloc); | ||
|  | void MatchFinder_Free(CMatchFinder *p, ISzAllocPtr alloc); | ||
|  | void MatchFinder_Normalize3(UInt32 subValue, CLzRef *items, size_t 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 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_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_LowHash(CMatchFinder *p); | ||
|  | void MatchFinder_Init_HighHash(CMatchFinder *p); | ||
|  | void MatchFinder_Init_3(CMatchFinder *p, int readData); | ||
|  | 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); | ||
|  | 
 | ||
|  | EXTERN_C_END | ||
|  | 
 | ||
|  | #endif
 |