mirror of
https://github.com/facebook/zstd.git
synced 2025-10-11 00:03:06 -04:00
code simplification (but reduce decompression speed ...)
This commit is contained in:
parent
5c71491a46
commit
b0aec17a90
49
lib/fse.c
49
lib/fse.c
@ -363,8 +363,7 @@ static size_t FSE_writeNCount_generic (void* header, size_t headerBufferSize,
|
|||||||
bitStream >>= 16;
|
bitStream >>= 16;
|
||||||
bitCount -= 16;
|
bitCount -= 16;
|
||||||
} }
|
} }
|
||||||
{
|
{ short count = normalizedCounter[charnum++];
|
||||||
short count = normalizedCounter[charnum++];
|
|
||||||
const short max = (short)((2*threshold-1)-remaining);
|
const short max = (short)((2*threshold-1)-remaining);
|
||||||
remaining -= FSE_abs(count);
|
remaining -= FSE_abs(count);
|
||||||
if (remaining<1) return ERROR(GENERIC);
|
if (remaining<1) return ERROR(GENERIC);
|
||||||
@ -506,11 +505,11 @@ size_t FSE_readNCount (short* normalizedCounter, unsigned* maxSVPtr, unsigned* t
|
|||||||
* Counting histogram
|
* Counting histogram
|
||||||
****************************************************************/
|
****************************************************************/
|
||||||
/*! FSE_count_simple
|
/*! FSE_count_simple
|
||||||
This function just counts byte values within @src,
|
This function just counts byte values within `src`,
|
||||||
and store the histogram into @count.
|
and store the histogram into table `count`.
|
||||||
This function is unsafe : it doesn't check that all values within @src can fit into @count.
|
This function is unsafe : it doesn't check that all values within `src` can fit into `count`.
|
||||||
For this reason, prefer using a table @count with 256 elements.
|
For this reason, prefer using a table `count` with 256 elements.
|
||||||
@return : highest count for a single element
|
@return : count of most numerous element
|
||||||
*/
|
*/
|
||||||
static size_t FSE_count_simple(unsigned* count, unsigned* maxSymbolValuePtr,
|
static size_t FSE_count_simple(unsigned* count, unsigned* maxSymbolValuePtr,
|
||||||
const void* src, size_t srcSize)
|
const void* src, size_t srcSize)
|
||||||
@ -519,7 +518,6 @@ static size_t FSE_count_simple(unsigned* count, unsigned* maxSymbolValuePtr,
|
|||||||
const BYTE* const end = ip + srcSize;
|
const BYTE* const end = ip + srcSize;
|
||||||
unsigned maxSymbolValue = *maxSymbolValuePtr;
|
unsigned maxSymbolValue = *maxSymbolValuePtr;
|
||||||
unsigned max=0;
|
unsigned max=0;
|
||||||
U32 s;
|
|
||||||
|
|
||||||
memset(count, 0, (maxSymbolValue+1)*sizeof(*count));
|
memset(count, 0, (maxSymbolValue+1)*sizeof(*count));
|
||||||
if (srcSize==0) { *maxSymbolValuePtr = 0; return 0; }
|
if (srcSize==0) { *maxSymbolValuePtr = 0; return 0; }
|
||||||
@ -529,7 +527,7 @@ static size_t FSE_count_simple(unsigned* count, unsigned* maxSymbolValuePtr,
|
|||||||
while (!count[maxSymbolValue]) maxSymbolValue--;
|
while (!count[maxSymbolValue]) maxSymbolValue--;
|
||||||
*maxSymbolValuePtr = maxSymbolValue;
|
*maxSymbolValuePtr = maxSymbolValue;
|
||||||
|
|
||||||
for (s=0; s<=maxSymbolValue; s++) if (count[s] > max) max = count[s];
|
{ U32 s; for (s=0; s<=maxSymbolValue; s++) if (count[s] > max) max = count[s]; }
|
||||||
|
|
||||||
return (size_t)max;
|
return (size_t)max;
|
||||||
}
|
}
|
||||||
@ -543,7 +541,6 @@ static size_t FSE_count_parallel(unsigned* count, unsigned* maxSymbolValuePtr,
|
|||||||
const BYTE* const iend = ip+sourceSize;
|
const BYTE* const iend = ip+sourceSize;
|
||||||
unsigned maxSymbolValue = *maxSymbolValuePtr;
|
unsigned maxSymbolValue = *maxSymbolValuePtr;
|
||||||
unsigned max=0;
|
unsigned max=0;
|
||||||
U32 s;
|
|
||||||
|
|
||||||
U32 Counting1[256] = { 0 };
|
U32 Counting1[256] = { 0 };
|
||||||
U32 Counting2[256] = { 0 };
|
U32 Counting2[256] = { 0 };
|
||||||
@ -558,8 +555,8 @@ static size_t FSE_count_parallel(unsigned* count, unsigned* maxSymbolValuePtr,
|
|||||||
}
|
}
|
||||||
if (!maxSymbolValue) maxSymbolValue = 255; /* 0 == default */
|
if (!maxSymbolValue) maxSymbolValue = 255; /* 0 == default */
|
||||||
|
|
||||||
{ /* by stripes of 16 bytes */
|
/* by stripes of 16 bytes */
|
||||||
U32 cached = MEM_read32(ip); ip += 4;
|
{ U32 cached = MEM_read32(ip); ip += 4;
|
||||||
while (ip < iend-15) {
|
while (ip < iend-15) {
|
||||||
U32 c = cached; cached = MEM_read32(ip); ip += 4;
|
U32 c = cached; cached = MEM_read32(ip); ip += 4;
|
||||||
Counting1[(BYTE) c ]++;
|
Counting1[(BYTE) c ]++;
|
||||||
@ -589,15 +586,15 @@ static size_t FSE_count_parallel(unsigned* count, unsigned* maxSymbolValuePtr,
|
|||||||
while (ip<iend) Counting1[*ip++]++;
|
while (ip<iend) Counting1[*ip++]++;
|
||||||
|
|
||||||
if (checkMax) { /* verify stats will fit into destination table */
|
if (checkMax) { /* verify stats will fit into destination table */
|
||||||
for (s=255; s>maxSymbolValue; s--) {
|
U32 s; for (s=255; s>maxSymbolValue; s--) {
|
||||||
Counting1[s] += Counting2[s] + Counting3[s] + Counting4[s];
|
Counting1[s] += Counting2[s] + Counting3[s] + Counting4[s];
|
||||||
if (Counting1[s]) return ERROR(maxSymbolValue_tooSmall);
|
if (Counting1[s]) return ERROR(maxSymbolValue_tooSmall);
|
||||||
} }
|
} }
|
||||||
|
|
||||||
for (s=0; s<=maxSymbolValue; s++) {
|
{ U32 s; for (s=0; s<=maxSymbolValue; s++) {
|
||||||
count[s] = Counting1[s] + Counting2[s] + Counting3[s] + Counting4[s];
|
count[s] = Counting1[s] + Counting2[s] + Counting3[s] + Counting4[s];
|
||||||
if (count[s] > max) max = count[s];
|
if (count[s] > max) max = count[s];
|
||||||
}
|
}}
|
||||||
|
|
||||||
while (!count[maxSymbolValue]) maxSymbolValue--;
|
while (!count[maxSymbolValue]) maxSymbolValue--;
|
||||||
*maxSymbolValuePtr = maxSymbolValue;
|
*maxSymbolValuePtr = maxSymbolValue;
|
||||||
@ -631,7 +628,7 @@ size_t FSE_count(unsigned* count, unsigned* maxSymbolValuePtr,
|
|||||||
`U16 maxSymbolValue;`
|
`U16 maxSymbolValue;`
|
||||||
`U16 nextStateNumber[1 << tableLog];` // This size is variable
|
`U16 nextStateNumber[1 << tableLog];` // This size is variable
|
||||||
`FSE_symbolCompressionTransform symbolTT[maxSymbolValue+1];` // This size is variable
|
`FSE_symbolCompressionTransform symbolTT[maxSymbolValue+1];` // This size is variable
|
||||||
Allocation is manual, since C standard does not support variable-size structures.
|
Allocation is manual (C standard does not support variable-size structures).
|
||||||
*/
|
*/
|
||||||
|
|
||||||
size_t FSE_sizeof_CTable (unsigned maxSymbolValue, unsigned tableLog)
|
size_t FSE_sizeof_CTable (unsigned maxSymbolValue, unsigned tableLog)
|
||||||
@ -727,7 +724,7 @@ static size_t FSE_normalizeM2(short* norm, U32 tableLog, const unsigned* count,
|
|||||||
/* all values are pretty poor;
|
/* all values are pretty poor;
|
||||||
probably incompressible data (should have already been detected);
|
probably incompressible data (should have already been detected);
|
||||||
find max, then give all remaining points to max */
|
find max, then give all remaining points to max */
|
||||||
U32 maxV = 0, maxC =0;
|
U32 maxV = 0, maxC = 0;
|
||||||
for (s=0; s<=maxSymbolValue; s++)
|
for (s=0; s<=maxSymbolValue; s++)
|
||||||
if (count[s] > maxC) maxV=s, maxC=count[s];
|
if (count[s] > maxC) maxV=s, maxC=count[s];
|
||||||
norm[maxV] += (short)ToDistribute;
|
norm[maxV] += (short)ToDistribute;
|
||||||
@ -765,8 +762,7 @@ size_t FSE_normalizeCount (short* normalizedCounter, unsigned tableLog,
|
|||||||
if (tableLog > FSE_MAX_TABLELOG) return ERROR(tableLog_tooLarge); /* Unsupported size */
|
if (tableLog > FSE_MAX_TABLELOG) return ERROR(tableLog_tooLarge); /* Unsupported size */
|
||||||
if (tableLog < FSE_minTableLog(total, maxSymbolValue)) return ERROR(GENERIC); /* Too small tableLog, compression potentially impossible */
|
if (tableLog < FSE_minTableLog(total, maxSymbolValue)) return ERROR(GENERIC); /* Too small tableLog, compression potentially impossible */
|
||||||
|
|
||||||
{
|
{ U32 const rtbTable[] = { 0, 473195, 504333, 520860, 550000, 700000, 750000, 830000 };
|
||||||
U32 const rtbTable[] = { 0, 473195, 504333, 520860, 550000, 700000, 750000, 830000 };
|
|
||||||
U64 const scale = 62 - tableLog;
|
U64 const scale = 62 - tableLog;
|
||||||
U64 const step = ((U64)1<<62) / total; /* <== here, one division ! */
|
U64 const step = ((U64)1<<62) / total; /* <== here, one division ! */
|
||||||
U64 const vStep = 1ULL<<(scale-20);
|
U64 const vStep = 1ULL<<(scale-20);
|
||||||
@ -842,13 +838,11 @@ size_t FSE_buildCTable_raw (FSE_CTable* ct, unsigned nbBits)
|
|||||||
tableU16[s] = (U16)(tableSize + s);
|
tableU16[s] = (U16)(tableSize + s);
|
||||||
|
|
||||||
/* Build Symbol Transformation Table */
|
/* Build Symbol Transformation Table */
|
||||||
{
|
{ const U32 deltaNbBits = (nbBits << 16) - (1 << nbBits);
|
||||||
const U32 deltaNbBits = (nbBits << 16) - (1 << nbBits);
|
|
||||||
for (s=0; s<=maxSymbolValue; s++) {
|
for (s=0; s<=maxSymbolValue; s++) {
|
||||||
symbolTT[s].deltaNbBits = deltaNbBits;
|
symbolTT[s].deltaNbBits = deltaNbBits;
|
||||||
symbolTT[s].deltaFindState = s-1;
|
symbolTT[s].deltaFindState = s-1;
|
||||||
}
|
} }
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -884,15 +878,13 @@ static size_t FSE_compress_usingCTable_generic (void* dst, size_t dstSize,
|
|||||||
const BYTE* const istart = (const BYTE*) src;
|
const BYTE* const istart = (const BYTE*) src;
|
||||||
const BYTE* const iend = istart + srcSize;
|
const BYTE* const iend = istart + srcSize;
|
||||||
const BYTE* ip=iend;
|
const BYTE* ip=iend;
|
||||||
|
|
||||||
size_t errorCode;
|
|
||||||
BIT_CStream_t bitC;
|
BIT_CStream_t bitC;
|
||||||
FSE_CState_t CState1, CState2;
|
FSE_CState_t CState1, CState2;
|
||||||
|
|
||||||
/* init */
|
/* init */
|
||||||
if (srcSize <= 2) return 0;
|
if (srcSize <= 2) return 0;
|
||||||
errorCode = BIT_initCStream(&bitC, dst, dstSize);
|
{ size_t const errorCode = BIT_initCStream(&bitC, dst, dstSize);
|
||||||
if (FSE_isError(errorCode)) return 0;
|
if (FSE_isError(errorCode)) return 0; }
|
||||||
|
|
||||||
#define FSE_FLUSHBITS(s) (fast ? BIT_flushBitsFast(s) : BIT_flushBits(s))
|
#define FSE_FLUSHBITS(s) (fast ? BIT_flushBitsFast(s) : BIT_flushBits(s))
|
||||||
|
|
||||||
@ -915,8 +907,7 @@ static size_t FSE_compress_usingCTable_generic (void* dst, size_t dstSize,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* 2 or 4 encoding per loop */
|
/* 2 or 4 encoding per loop */
|
||||||
for ( ; ip>istart ; )
|
for ( ; ip>istart ; ) {
|
||||||
{
|
|
||||||
FSE_encodeSymbol(&bitC, &CState2, *--ip);
|
FSE_encodeSymbol(&bitC, &CState2, *--ip);
|
||||||
|
|
||||||
if (sizeof(bitC.bitContainer)*8 < FSE_MAX_TABLELOG*2+7 ) /* this test must be static */
|
if (sizeof(bitC.bitContainer)*8 < FSE_MAX_TABLELOG*2+7 ) /* this test must be static */
|
||||||
|
@ -191,7 +191,7 @@ static size_t ZSTD_resetCCtx_advanced (ZSTD_CCtx* zc,
|
|||||||
const size_t tableSpace = (contentSize + hSize + h3Size) * sizeof(U32);
|
const size_t tableSpace = (contentSize + hSize + h3Size) * sizeof(U32);
|
||||||
|
|
||||||
/* Check if workSpace is large enough, alloc a new one if needed */
|
/* Check if workSpace is large enough, alloc a new one if needed */
|
||||||
{ size_t const optSpace = ((1<<MLbits) + (1<<LLbits) + (1<<Offbits) + (1<<Litbits))*sizeof(U32)
|
{ size_t const optSpace = ((1<<MLbits) + (MaxLL+1) + (1<<Offbits) + (1<<Litbits))*sizeof(U32)
|
||||||
+ (ZSTD_OPT_NUM+1)*(sizeof(ZSTD_match_t) + sizeof(ZSTD_optimal_t));
|
+ (ZSTD_OPT_NUM+1)*(sizeof(ZSTD_match_t) + sizeof(ZSTD_optimal_t));
|
||||||
size_t const neededSpace = tableSpace + (256*sizeof(U32)) /* huffTable */ + tokenSpace
|
size_t const neededSpace = tableSpace + (256*sizeof(U32)) /* huffTable */ + tokenSpace
|
||||||
+ ((params.strategy == ZSTD_btopt) ? optSpace : 0);
|
+ ((params.strategy == ZSTD_btopt) ? optSpace : 0);
|
||||||
@ -230,7 +230,7 @@ static size_t ZSTD_resetCCtx_advanced (ZSTD_CCtx* zc,
|
|||||||
if (params.strategy == ZSTD_btopt) {
|
if (params.strategy == ZSTD_btopt) {
|
||||||
zc->seqStore.litFreq = (U32*)((void*)(zc->seqStore.dumpsStart + maxNbSeq));
|
zc->seqStore.litFreq = (U32*)((void*)(zc->seqStore.dumpsStart + maxNbSeq));
|
||||||
zc->seqStore.litLengthFreq = zc->seqStore.litFreq + (1<<Litbits);
|
zc->seqStore.litLengthFreq = zc->seqStore.litFreq + (1<<Litbits);
|
||||||
zc->seqStore.matchLengthFreq = zc->seqStore.litLengthFreq + (1<<LLbits);
|
zc->seqStore.matchLengthFreq = zc->seqStore.litLengthFreq + (MaxLL+1);
|
||||||
zc->seqStore.offCodeFreq = zc->seqStore.matchLengthFreq + (1<<MLbits);
|
zc->seqStore.offCodeFreq = zc->seqStore.matchLengthFreq + (1<<MLbits);
|
||||||
zc->seqStore.matchTable = (ZSTD_match_t*)((void*)(zc->seqStore.offCodeFreq + (1<<Offbits)));
|
zc->seqStore.matchTable = (ZSTD_match_t*)((void*)(zc->seqStore.offCodeFreq + (1<<Offbits)));
|
||||||
zc->seqStore.priceTable = (ZSTD_optimal_t*)((void*)(zc->seqStore.matchTable + ZSTD_OPT_NUM+1));
|
zc->seqStore.priceTable = (ZSTD_optimal_t*)((void*)(zc->seqStore.matchTable + ZSTD_OPT_NUM+1));
|
||||||
@ -585,7 +585,7 @@ size_t ZSTD_compressSequences(ZSTD_CCtx* zc,
|
|||||||
FSE_CTable* CTable_OffsetBits = zc->offcodeCTable;
|
FSE_CTable* CTable_OffsetBits = zc->offcodeCTable;
|
||||||
FSE_CTable* CTable_MatchLength = zc->matchlengthCTable;
|
FSE_CTable* CTable_MatchLength = zc->matchlengthCTable;
|
||||||
U32 LLtype, Offtype, MLtype; /* compressed, raw or rle */
|
U32 LLtype, Offtype, MLtype; /* compressed, raw or rle */
|
||||||
const U16* const llTable = seqStorePtr->litLengthStart;
|
U16* const llTable = seqStorePtr->litLengthStart;
|
||||||
const BYTE* const mlTable = seqStorePtr->matchLengthStart;
|
const BYTE* const mlTable = seqStorePtr->matchLengthStart;
|
||||||
const U32* const offsetTable = seqStorePtr->offsetStart;
|
const U32* const offsetTable = seqStorePtr->offsetStart;
|
||||||
const U32* const offsetTableEnd = seqStorePtr->offset;
|
const U32* const offsetTableEnd = seqStorePtr->offset;
|
||||||
@ -636,26 +636,24 @@ size_t ZSTD_compressSequences(ZSTD_CCtx* zc,
|
|||||||
#define MAX_SEQ_FOR_STATIC_FSE 1000
|
#define MAX_SEQ_FOR_STATIC_FSE 1000
|
||||||
|
|
||||||
/* LL codes */
|
/* LL codes */
|
||||||
static const BYTE llCode[64] = { 0, 1, 2, 3, 4, 5, 6, 7,
|
{ static const BYTE LL_Code[64] = { 0, 1, 2, 3, 4, 5, 6, 7,
|
||||||
8, 9, 10, 11, 12, 13, 14, 15,
|
8, 9, 10, 11, 12, 13, 14, 15,
|
||||||
16, 16, 17, 17, 18, 18, 19, 19,
|
16, 16, 17, 17, 18, 18, 19, 19,
|
||||||
20, 20, 20, 20, 21, 21, 21, 21,
|
20, 20, 20, 20, 21, 21, 21, 21,
|
||||||
22, 22, 22, 22, 22, 22, 22, 22,
|
22, 22, 22, 22, 22, 22, 22, 22,
|
||||||
23, 23, 23, 23, 23, 23, 23, 23,
|
23, 23, 23, 23, 23, 23, 23, 23,
|
||||||
24, 24, 24, 24, 24, 24, 24, 24,
|
24, 24, 24, 24, 24, 24, 24, 24,
|
||||||
24, 24, 24, 24, 24, 24, 24, 24 };
|
24, 24, 24, 24, 24, 24, 24, 24 };
|
||||||
static const BYTE deltaCode = 18;
|
const BYTE deltaCode = 19;
|
||||||
|
size_t i;
|
||||||
{ size_t i;
|
|
||||||
for (i=0; i<nbSeq; i++) {
|
for (i=0; i<nbSeq; i++) {
|
||||||
U32 ll = llTable[i];
|
U32 ll = llTable[i];
|
||||||
if (llTable[i] == 65535) ll = seqStorePtr->litLengthLong;
|
if (llTable[i] == 65535) { ll = seqStorePtr->litLengthLong; llTable[i] = (U16)ll; }
|
||||||
llCodeTable[i] = (ll>63) ? ZSTD_highbit(ll) + deltaCode : llCode[ll];
|
llCodeTable[i] = (ll>63) ? ZSTD_highbit(ll) + deltaCode : LL_Code[ll];
|
||||||
} }
|
} }
|
||||||
|
|
||||||
/* CTable for Literal Lengths */
|
/* CTable for Literal Lengths */
|
||||||
#if 1
|
{ U32 max = MaxLL;
|
||||||
{ U32 max = 35;
|
|
||||||
size_t const mostFrequent = FSE_countFast(count, &max, llCodeTable, nbSeq);
|
size_t const mostFrequent = FSE_countFast(count, &max, llCodeTable, nbSeq);
|
||||||
if ((mostFrequent == nbSeq) && (nbSeq > 2)) {
|
if ((mostFrequent == nbSeq) && (nbSeq > 2)) {
|
||||||
*op++ = llCodeTable[0];
|
*op++ = llCodeTable[0];
|
||||||
@ -663,14 +661,8 @@ static const BYTE deltaCode = 18;
|
|||||||
LLtype = FSE_ENCODING_RLE;
|
LLtype = FSE_ENCODING_RLE;
|
||||||
} else if ((zc->flagStaticTables) && (nbSeq < MAX_SEQ_FOR_STATIC_FSE)) {
|
} else if ((zc->flagStaticTables) && (nbSeq < MAX_SEQ_FOR_STATIC_FSE)) {
|
||||||
LLtype = FSE_ENCODING_STATIC;
|
LLtype = FSE_ENCODING_STATIC;
|
||||||
} else if ((nbSeq < MIN_SEQ_FOR_DYNAMIC_FSE) || (mostFrequent < (nbSeq >> (LLbits-1)))) {
|
} else if ((nbSeq < MIN_SEQ_FOR_DYNAMIC_FSE) || (mostFrequent < (nbSeq >> (LL_defaultNormLog-1)))) {
|
||||||
static const S16 LL_defaultNorm[36] = { 2, 2, 2, 2, 2, 2, 2, 2,
|
FSE_buildCTable(CTable_LitLength, LL_defaultNorm, MaxLL, LL_defaultNormLog);
|
||||||
2, 2, 2, 2, 2, 2, 2, 2,
|
|
||||||
2, 2, 2, 2, 2, 2, 2, 2,
|
|
||||||
2, 2, 2, 2, 1, 1, 1, 1,
|
|
||||||
1, 1, 1, 1 };
|
|
||||||
static const U32 LL_defaultNormLog = 6;
|
|
||||||
FSE_buildCTable(CTable_LitLength, LL_defaultNorm, 35, LL_defaultNormLog);
|
|
||||||
LLtype = FSE_ENCODING_RAW;
|
LLtype = FSE_ENCODING_RAW;
|
||||||
} else {
|
} else {
|
||||||
size_t NCountSize;
|
size_t NCountSize;
|
||||||
@ -684,31 +676,6 @@ static const BYTE deltaCode = 18;
|
|||||||
FSE_buildCTable(CTable_LitLength, norm, max, tableLog);
|
FSE_buildCTable(CTable_LitLength, norm, max, tableLog);
|
||||||
LLtype = FSE_ENCODING_DYNAMIC;
|
LLtype = FSE_ENCODING_DYNAMIC;
|
||||||
}}
|
}}
|
||||||
#else
|
|
||||||
{ U32 max = MaxLL;
|
|
||||||
size_t const mostFrequent = FSE_countFast(count, &max, llTable, nbSeq);
|
|
||||||
if ((mostFrequent == nbSeq) && (nbSeq > 2)) {
|
|
||||||
*op++ = llTable[0];
|
|
||||||
FSE_buildCTable_rle(CTable_LitLength, (BYTE)max);
|
|
||||||
LLtype = FSE_ENCODING_RLE;
|
|
||||||
} else if ((zc->flagStaticTables) && (nbSeq < MAX_SEQ_FOR_STATIC_FSE)) {
|
|
||||||
LLtype = FSE_ENCODING_STATIC;
|
|
||||||
} else if ((nbSeq < MIN_SEQ_FOR_DYNAMIC_FSE) || (mostFrequent < (nbSeq >> (LLbits-1)))) {
|
|
||||||
FSE_buildCTable_raw(CTable_LitLength, LLbits);
|
|
||||||
LLtype = FSE_ENCODING_RAW;
|
|
||||||
} else {
|
|
||||||
size_t NCountSize;
|
|
||||||
size_t nbSeq_1 = nbSeq;
|
|
||||||
const U32 tableLog = FSE_optimalTableLog(LLFSELog, nbSeq, max);
|
|
||||||
if (count[llTable[nbSeq-1]]>1) { count[llTable[nbSeq-1]]--; nbSeq_1--; }
|
|
||||||
FSE_normalizeCount(norm, tableLog, count, nbSeq_1, max);
|
|
||||||
NCountSize = FSE_writeNCount(op, oend-op, norm, max, tableLog); /* overflow protected */
|
|
||||||
if (FSE_isError(NCountSize)) return ERROR(GENERIC);
|
|
||||||
op += NCountSize;
|
|
||||||
FSE_buildCTable(CTable_LitLength, norm, max, tableLog);
|
|
||||||
LLtype = FSE_ENCODING_DYNAMIC;
|
|
||||||
}}
|
|
||||||
#endif // 0
|
|
||||||
|
|
||||||
/* Offset codes */
|
/* Offset codes */
|
||||||
{ size_t i; for (i=0; i<nbSeq; i++) offCodeTable[i] = offsetTable[i] ? (BYTE)ZSTD_highbit(offsetTable[i]) + 1 : 0; }
|
{ size_t i; for (i=0; i<nbSeq; i++) offCodeTable[i] = offsetTable[i] ? (BYTE)ZSTD_highbit(offsetTable[i]) + 1 : 0; }
|
||||||
@ -778,14 +745,9 @@ static const BYTE deltaCode = 18;
|
|||||||
FSE_initCState2(&stateOffsetBits, CTable_OffsetBits, offCodeTable[nbSeq-1]);
|
FSE_initCState2(&stateOffsetBits, CTable_OffsetBits, offCodeTable[nbSeq-1]);
|
||||||
FSE_initCState2(&stateLitLength, CTable_LitLength, llCodeTable[nbSeq-1]);
|
FSE_initCState2(&stateLitLength, CTable_LitLength, llCodeTable[nbSeq-1]);
|
||||||
BIT_addBits(&blockStream, offsetTable[nbSeq-1], offCodeTable[nbSeq-1] ? (offCodeTable[nbSeq-1]-1) : 0);
|
BIT_addBits(&blockStream, offsetTable[nbSeq-1], offCodeTable[nbSeq-1] ? (offCodeTable[nbSeq-1]-1) : 0);
|
||||||
|
BIT_addBits(&blockStream, llTable[nbSeq-1], LL_bits[llCodeTable[nbSeq-1]]);
|
||||||
BIT_flushBits(&blockStream);
|
BIT_flushBits(&blockStream);
|
||||||
|
|
||||||
static const U32 llBits[36] = { 0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
1, 1, 1, 1, 2, 2, 3, 3,
|
|
||||||
4, 6, 7, 8, 9,10,11,12,
|
|
||||||
13,14,15,16 };
|
|
||||||
|
|
||||||
{ size_t n;
|
{ size_t n;
|
||||||
for (n=nbSeq-2; n<nbSeq; n--) { /* intentional underflow */
|
for (n=nbSeq-2; n<nbSeq; n--) { /* intentional underflow */
|
||||||
const BYTE mlCode = mlTable[n];
|
const BYTE mlCode = mlTable[n];
|
||||||
@ -800,7 +762,7 @@ static const U32 llBits[36] = { 0, 0, 0, 0, 0, 0, 0, 0,
|
|||||||
if (MEM_32bits()) BIT_flushBits(&blockStream); /* 7 */
|
if (MEM_32bits()) BIT_flushBits(&blockStream); /* 7 */
|
||||||
//BIT_flushBits(&blockStream); /* 7 */ /* 7 */
|
//BIT_flushBits(&blockStream); /* 7 */ /* 7 */
|
||||||
BIT_addBits(&blockStream, offset, nbBits); /* 31 */ /* 61 */ /* 24 bits max in 32-bits mode */
|
BIT_addBits(&blockStream, offset, nbBits); /* 31 */ /* 61 */ /* 24 bits max in 32-bits mode */
|
||||||
BIT_addBits(&blockStream, llTable[n], llBits[LLCode]);
|
BIT_addBits(&blockStream, llTable[n], LL_bits[LLCode]);
|
||||||
BIT_flushBits(&blockStream); /* 7 */ /* 7 */
|
BIT_flushBits(&blockStream); /* 7 */ /* 7 */
|
||||||
} }
|
} }
|
||||||
#else
|
#else
|
||||||
@ -856,10 +818,11 @@ MEM_STATIC void ZSTD_storeSeq(seqStore_t* seqStorePtr, size_t litLength, const B
|
|||||||
{
|
{
|
||||||
#if 0 /* for debug */
|
#if 0 /* for debug */
|
||||||
static const BYTE* g_start = NULL;
|
static const BYTE* g_start = NULL;
|
||||||
|
const U32 pos = (U32)(literals - g_start);
|
||||||
if (g_start==NULL) g_start = literals;
|
if (g_start==NULL) g_start = literals;
|
||||||
//if (literals - g_start == 8695)
|
if ((pos > 198618400) && (pos < 198618500))
|
||||||
printf("pos %6u : %3u literals & match %3u bytes at distance %6u \n",
|
printf("pos %6u : %3u literals & match %3u bytes at distance %6u \n",
|
||||||
(U32)(literals - g_start), (U32)litLength, (U32)matchCode+MINMATCH, (U32)offsetCode);
|
pos, (U32)litLength, (U32)matchCode+MINMATCH, (U32)offsetCode);
|
||||||
#endif
|
#endif
|
||||||
#if ZSTD_OPT_DEBUG == 3
|
#if ZSTD_OPT_DEBUG == 3
|
||||||
if (offsetCode == 0) seqStorePtr->realRepSum++;
|
if (offsetCode == 0) seqStorePtr->realRepSum++;
|
||||||
@ -2278,7 +2241,7 @@ size_t ZSTD_compressBegin_advanced(ZSTD_CCtx* zc,
|
|||||||
ZSTD_validateParams(¶ms);
|
ZSTD_validateParams(¶ms);
|
||||||
|
|
||||||
{ size_t const errorCode = ZSTD_resetCCtx_advanced(zc, params);
|
{ size_t const errorCode = ZSTD_resetCCtx_advanced(zc, params);
|
||||||
if (ZSTD_isError(errorCode)) return errorCode; }
|
if (ZSTD_isError(errorCode)) return errorCode; }
|
||||||
|
|
||||||
/* Write Frame Header into ctx headerBuffer */
|
/* Write Frame Header into ctx headerBuffer */
|
||||||
MEM_writeLE32(zc->headerBuffer, ZSTD_MAGICNUMBER);
|
MEM_writeLE32(zc->headerBuffer, ZSTD_MAGICNUMBER);
|
||||||
|
@ -531,6 +531,34 @@ FORCE_INLINE size_t ZSTD_buildSeqTable(FSE_DTable* DTable, U32 type, U32 rawBits
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
FORCE_INLINE size_t ZSTD_buildSeqTableLL(FSE_DTable* DTable, U32 type, U32 max, U32 maxLog,
|
||||||
|
const void* src, size_t srcSize)
|
||||||
|
{
|
||||||
|
switch(type)
|
||||||
|
{
|
||||||
|
case FSE_ENCODING_RLE :
|
||||||
|
if (!srcSize) return ERROR(srcSize_wrong);
|
||||||
|
if ( (*(const BYTE*)src) > max) return ERROR(corruption_detected);
|
||||||
|
FSE_buildDTable_rle(DTable, *(const BYTE*)src); /* if *src > max, data is corrupted */
|
||||||
|
return 1;
|
||||||
|
case FSE_ENCODING_RAW :
|
||||||
|
FSE_buildDTable(DTable, LL_defaultNorm, max, LL_defaultNormLog);
|
||||||
|
return 0;
|
||||||
|
case FSE_ENCODING_STATIC:
|
||||||
|
return 0;
|
||||||
|
default : /* impossible */
|
||||||
|
case FSE_ENCODING_DYNAMIC :
|
||||||
|
{ U32 tableLog;
|
||||||
|
S16 norm[MaxSeq+1];
|
||||||
|
size_t const headerSize = FSE_readNCount(norm, &max, &tableLog, src, srcSize);
|
||||||
|
if (FSE_isError(headerSize)) return ERROR(corruption_detected);
|
||||||
|
if (tableLog > maxLog) return ERROR(corruption_detected);
|
||||||
|
FSE_buildDTable(DTable, norm, max, tableLog);
|
||||||
|
return headerSize;
|
||||||
|
} }
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
size_t ZSTD_decodeSeqHeaders(int* nbSeq, const BYTE** dumpsPtr, size_t* dumpsLengthPtr,
|
size_t ZSTD_decodeSeqHeaders(int* nbSeq, const BYTE** dumpsPtr, size_t* dumpsLengthPtr,
|
||||||
FSE_DTable* DTableLL, FSE_DTable* DTableML, FSE_DTable* DTableOffb,
|
FSE_DTable* DTableLL, FSE_DTable* DTableML, FSE_DTable* DTableOffb,
|
||||||
const void* src, size_t srcSize)
|
const void* src, size_t srcSize)
|
||||||
@ -576,7 +604,7 @@ size_t ZSTD_decodeSeqHeaders(int* nbSeq, const BYTE** dumpsPtr, size_t* dumpsLen
|
|||||||
if (ip > iend-3) return ERROR(srcSize_wrong); /* min : all 3 are "raw", hence no header, but at least xxLog bits per type */
|
if (ip > iend-3) return ERROR(srcSize_wrong); /* min : all 3 are "raw", hence no header, but at least xxLog bits per type */
|
||||||
|
|
||||||
/* Build DTables */
|
/* Build DTables */
|
||||||
{ size_t const bhSize = ZSTD_buildSeqTable(DTableLL, LLtype, LLbits, LLFSELog, ip, iend-ip);
|
{ size_t const bhSize = ZSTD_buildSeqTableLL(DTableLL, LLtype, 35, LLFSELog, ip, iend-ip);
|
||||||
if (ZSTD_isError(bhSize)) return ERROR(corruption_detected);
|
if (ZSTD_isError(bhSize)) return ERROR(corruption_detected);
|
||||||
ip += bhSize;
|
ip += bhSize;
|
||||||
}
|
}
|
||||||
@ -612,21 +640,13 @@ typedef struct {
|
|||||||
|
|
||||||
static void ZSTD_decodeSequence(seq_t* seq, seqState_t* seqState, const U32 mls)
|
static void ZSTD_decodeSequence(seq_t* seq, seqState_t* seqState, const U32 mls)
|
||||||
{
|
{
|
||||||
const BYTE* dumps = seqState->dumps;
|
|
||||||
const BYTE* const de = seqState->dumpsEnd;
|
|
||||||
size_t litLength, offset;
|
|
||||||
|
|
||||||
/* Literal length */
|
/* Literal length */
|
||||||
litLength = FSE_peakSymbol(&(seqState->stateLL));
|
U32 const litCode = FSE_peakSymbol(&(seqState->stateLL));
|
||||||
if (litLength == MaxLL) {
|
{ static const U32 LL_base[MaxLL+1] = {
|
||||||
const U32 add = *dumps++;
|
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
|
||||||
if (add < 255) litLength += add;
|
16, 18, 20, 22, 24, 28, 32, 40, 48, 64, 0x80, 0x100, 0x200, 0x400, 0x800, 0x1000,
|
||||||
else {
|
0x2000, 0x4000, 0x8000, 0x10000 };
|
||||||
litLength = MEM_readLE32(dumps) & 0xFFFFFF; /* no risk : dumps is always followed by seq tables > 1 byte */
|
seq->litLength = LL_base[litCode] + BIT_readBits(&(seqState->DStream), LL_bits[litCode]);
|
||||||
if (litLength&1) litLength>>=1, dumps += 3;
|
|
||||||
else litLength = (U16)(litLength)>>1, dumps += 2;
|
|
||||||
}
|
|
||||||
if (dumps >= de) dumps = de-1; /* late correction, to avoid read overflow (data is now corrupted anyway) */
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Offset */
|
/* Offset */
|
||||||
@ -637,11 +657,12 @@ static void ZSTD_decodeSequence(seq_t* seq, seqState_t* seqState, const U32 mls)
|
|||||||
0x800000, 0x1000000, 0x2000000, 0x4000000, /*fake*/ 1, 1, 1, 1 };
|
0x800000, 0x1000000, 0x2000000, 0x4000000, /*fake*/ 1, 1, 1, 1 };
|
||||||
U32 const offsetCode = FSE_peakSymbol(&(seqState->stateOffb)); /* <= maxOff, by table construction */
|
U32 const offsetCode = FSE_peakSymbol(&(seqState->stateOffb)); /* <= maxOff, by table construction */
|
||||||
U32 const nbBits = offsetCode ? offsetCode-1 : 0;
|
U32 const nbBits = offsetCode ? offsetCode-1 : 0;
|
||||||
offset = offsetPrefix[offsetCode] + BIT_readBits(&(seqState->DStream), nbBits);
|
size_t const offset = offsetCode ? offsetPrefix[offsetCode] + BIT_readBits(&(seqState->DStream), nbBits) :
|
||||||
|
litCode ? seq->offset : seqState->prevOffset;
|
||||||
|
if (offsetCode | !litCode) seqState->prevOffset = seq->offset; /* cmove */
|
||||||
|
seq->offset = offset;
|
||||||
if (MEM_32bits()) BIT_reloadDStream(&(seqState->DStream));
|
if (MEM_32bits()) BIT_reloadDStream(&(seqState->DStream));
|
||||||
if (offsetCode==0) offset = litLength ? seq->offset : seqState->prevOffset;
|
FSE_decodeSymbol(&(seqState->stateOffb), &(seqState->DStream)); /* update */
|
||||||
if (offsetCode | !litLength) seqState->prevOffset = seq->offset; /* cmove */
|
|
||||||
FSE_decodeSymbol(&(seqState->stateOffb), &(seqState->DStream)); /* update */
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Literal length update */
|
/* Literal length update */
|
||||||
@ -650,7 +671,9 @@ static void ZSTD_decodeSequence(seq_t* seq, seqState_t* seqState, const U32 mls)
|
|||||||
|
|
||||||
/* MatchLength */
|
/* MatchLength */
|
||||||
{ size_t matchLength = FSE_decodeSymbol(&(seqState->stateML), &(seqState->DStream));
|
{ size_t matchLength = FSE_decodeSymbol(&(seqState->stateML), &(seqState->DStream));
|
||||||
|
const BYTE* dumps = seqState->dumps;
|
||||||
if (matchLength == MaxML) {
|
if (matchLength == MaxML) {
|
||||||
|
const BYTE* const de = seqState->dumpsEnd;
|
||||||
const U32 add = *dumps++;
|
const U32 add = *dumps++;
|
||||||
if (add < 255) matchLength += add;
|
if (add < 255) matchLength += add;
|
||||||
else {
|
else {
|
||||||
@ -662,13 +685,9 @@ static void ZSTD_decodeSequence(seq_t* seq, seqState_t* seqState, const U32 mls)
|
|||||||
}
|
}
|
||||||
matchLength += mls;
|
matchLength += mls;
|
||||||
seq->matchLength = matchLength;
|
seq->matchLength = matchLength;
|
||||||
|
seqState->dumps = dumps;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* save result */
|
|
||||||
seq->litLength = litLength;
|
|
||||||
seq->offset = offset;
|
|
||||||
seqState->dumps = dumps;
|
|
||||||
|
|
||||||
#if 0 /* debug */
|
#if 0 /* debug */
|
||||||
{
|
{
|
||||||
static U64 totalDecoded = 0;
|
static U64 totalDecoded = 0;
|
||||||
@ -799,13 +818,18 @@ static size_t ZSTD_decompressSequences(
|
|||||||
FSE_initDState(&(seqState.stateOffb), &(seqState.DStream), DTableOffb);
|
FSE_initDState(&(seqState.stateOffb), &(seqState.DStream), DTableOffb);
|
||||||
FSE_initDState(&(seqState.stateML), &(seqState.DStream), DTableML);
|
FSE_initDState(&(seqState.stateML), &(seqState.DStream), DTableML);
|
||||||
|
|
||||||
for ( ; (BIT_reloadDStream(&(seqState.DStream)) <= BIT_DStream_completed) && nbSeq ; ) {
|
for ( ; (BIT_reloadDStream(&(seqState.DStream)) <= BIT_DStream_completed) && nbSeq ; nbSeq--) {
|
||||||
size_t oneSeqSize;
|
size_t oneSeqSize;
|
||||||
nbSeq--;
|
|
||||||
ZSTD_decodeSequence(&sequence, &seqState, mls);
|
ZSTD_decodeSequence(&sequence, &seqState, mls);
|
||||||
|
#if 0 /* for debug */
|
||||||
|
{ U32 pos = (U32)(op-base);
|
||||||
|
if ((pos > 198618400) && (pos < 198618500))
|
||||||
|
printf("pos %6u : %3u literals & match %3u bytes at distance %6u \n",
|
||||||
|
pos, (U32)sequence.litLength, (U32)sequence.matchLength, (U32)sequence.offset);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
oneSeqSize = ZSTD_execSequence(op, oend, sequence, &litPtr, litLimit_8, base, vBase, dictEnd);
|
oneSeqSize = ZSTD_execSequence(op, oend, sequence, &litPtr, litLimit_8, base, vBase, dictEnd);
|
||||||
if (ZSTD_isError(oneSeqSize))
|
if (ZSTD_isError(oneSeqSize)) return oneSeqSize;
|
||||||
return oneSeqSize;
|
|
||||||
op += oneSeqSize;
|
op += oneSeqSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -103,11 +103,10 @@ typedef enum { bt_compressed, bt_raw, bt_rle, bt_end } blockType_t;
|
|||||||
|
|
||||||
#define Litbits 8
|
#define Litbits 8
|
||||||
#define MLbits 7
|
#define MLbits 7
|
||||||
#define LLbits 6
|
|
||||||
#define Offbits 5
|
#define Offbits 5
|
||||||
#define MaxLit ((1<<Litbits) - 1)
|
#define MaxLit ((1<<Litbits) - 1)
|
||||||
#define MaxML ((1<<MLbits) - 1)
|
#define MaxML ((1<<MLbits) - 1)
|
||||||
#define MaxLL ((1<<LLbits) - 1)
|
#define MaxLL 35
|
||||||
#define MaxOff ((1<<Offbits)- 1)
|
#define MaxOff ((1<<Offbits)- 1)
|
||||||
#define MLFSELog 10
|
#define MLFSELog 10
|
||||||
#define LLFSELog 9
|
#define LLFSELog 9
|
||||||
@ -119,6 +118,14 @@ typedef enum { bt_compressed, bt_raw, bt_rle, bt_end } blockType_t;
|
|||||||
#define FSE_ENCODING_STATIC 2
|
#define FSE_ENCODING_STATIC 2
|
||||||
#define FSE_ENCODING_DYNAMIC 3
|
#define FSE_ENCODING_DYNAMIC 3
|
||||||
|
|
||||||
|
static const U32 LL_bits[MaxLL+1] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
1, 1, 1, 1, 2, 2, 3, 3, 4, 6, 7, 8, 9,10,11,12,
|
||||||
|
13,14,15,16 };
|
||||||
|
static const S16 LL_defaultNorm[MaxLL+1] = { 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
|
||||||
|
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1,
|
||||||
|
1, 1, 1, 1 };
|
||||||
|
static const U32 LL_defaultNormLog = 6;
|
||||||
|
|
||||||
|
|
||||||
/*-*******************************************
|
/*-*******************************************
|
||||||
* Shared functions to include for inlining
|
* Shared functions to include for inlining
|
||||||
|
@ -31,7 +31,7 @@
|
|||||||
- Zstd source repository : https://www.zstd.net
|
- Zstd source repository : https://www.zstd.net
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* Note : this file is intended to be included within zstd_compress.c */
|
/* Note : this file is intended to be included within zstd_compress.c */
|
||||||
|
|
||||||
|
|
||||||
#define ZSTD_FREQ_DIV 5
|
#define ZSTD_FREQ_DIV 5
|
||||||
@ -55,7 +55,7 @@ MEM_STATIC void ZSTD_rescaleFreqs(seqStore_t* ssPtr)
|
|||||||
|
|
||||||
if (ssPtr->litLengthSum == 0) {
|
if (ssPtr->litLengthSum == 0) {
|
||||||
ssPtr->litSum = (2<<Litbits);
|
ssPtr->litSum = (2<<Litbits);
|
||||||
ssPtr->litLengthSum = (1<<LLbits);
|
ssPtr->litLengthSum = MaxLL+1;
|
||||||
ssPtr->matchLengthSum = (1<<MLbits);
|
ssPtr->matchLengthSum = (1<<MLbits);
|
||||||
ssPtr->offCodeSum = (1<<Offbits);
|
ssPtr->offCodeSum = (1<<Offbits);
|
||||||
ssPtr->matchSum = (2<<Litbits);
|
ssPtr->matchSum = (2<<Litbits);
|
||||||
@ -93,7 +93,7 @@ MEM_STATIC void ZSTD_rescaleFreqs(seqStore_t* ssPtr)
|
|||||||
ssPtr->offCodeSum += ssPtr->offCodeFreq[u];
|
ssPtr->offCodeSum += ssPtr->offCodeFreq[u];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ZSTD_setLog2Prices(ssPtr);
|
ZSTD_setLog2Prices(ssPtr);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -243,7 +243,7 @@ static U32 ZSTD_insertBtAndGetAllMatches (
|
|||||||
|
|
||||||
if (minMatch == 3) { /* HC3 match finder */
|
if (minMatch == 3) { /* HC3 match finder */
|
||||||
U32 matchIndex3 = ZSTD_insertAndFindFirstIndexHash3 (zc, ip);
|
U32 matchIndex3 = ZSTD_insertAndFindFirstIndexHash3 (zc, ip);
|
||||||
|
|
||||||
if (matchIndex3>windowLow && (current - matchIndex3 < (1<<18))) {
|
if (matchIndex3>windowLow && (current - matchIndex3 < (1<<18))) {
|
||||||
const BYTE* match;
|
const BYTE* match;
|
||||||
size_t currentMl=0;
|
size_t currentMl=0;
|
||||||
@ -408,7 +408,7 @@ void ZSTD_compressBlock_opt_generic(ZSTD_CCtx* ctx,
|
|||||||
const BYTE* const ilimit = iend - 8;
|
const BYTE* const ilimit = iend - 8;
|
||||||
const BYTE* const base = ctx->base;
|
const BYTE* const base = ctx->base;
|
||||||
const BYTE* const prefixStart = base + ctx->dictLimit;
|
const BYTE* const prefixStart = base + ctx->dictLimit;
|
||||||
|
|
||||||
U32 rep_2=REPCODE_STARTVALUE, rep_1=REPCODE_STARTVALUE;
|
U32 rep_2=REPCODE_STARTVALUE, rep_1=REPCODE_STARTVALUE;
|
||||||
const U32 maxSearches = 1U << ctx->params.searchLog;
|
const U32 maxSearches = 1U << ctx->params.searchLog;
|
||||||
const U32 sufficient_len = ctx->params.targetLength;
|
const U32 sufficient_len = ctx->params.targetLength;
|
||||||
@ -733,7 +733,7 @@ void ZSTD_compressBlock_opt_extDict_generic(ZSTD_CCtx* ctx,
|
|||||||
const BYTE* const dictBase = ctx->dictBase;
|
const BYTE* const dictBase = ctx->dictBase;
|
||||||
const BYTE* const dictEnd = dictBase + dictLimit;
|
const BYTE* const dictEnd = dictBase + dictLimit;
|
||||||
const U32 lowLimit = ctx->lowLimit;
|
const U32 lowLimit = ctx->lowLimit;
|
||||||
|
|
||||||
U32 rep_2=REPCODE_STARTVALUE, rep_1=REPCODE_STARTVALUE;
|
U32 rep_2=REPCODE_STARTVALUE, rep_1=REPCODE_STARTVALUE;
|
||||||
const U32 maxSearches = 1U << ctx->params.searchLog;
|
const U32 maxSearches = 1U << ctx->params.searchLog;
|
||||||
const U32 sufficient_len = ctx->params.targetLength;
|
const U32 sufficient_len = ctx->params.targetLength;
|
||||||
@ -1044,12 +1044,12 @@ _storeSequence: // cur, last_pos, best_mlen, best_off have to be set
|
|||||||
break;
|
break;
|
||||||
} else {
|
} else {
|
||||||
const BYTE* repMatch = dictBase + ((anchor-base) - rep_2);
|
const BYTE* repMatch = dictBase + ((anchor-base) - rep_2);
|
||||||
if ((repMatch + minMatch <= dictEnd) && (MEM_readMINMATCH(anchor, minMatch) == MEM_readMINMATCH(repMatch, minMatch)))
|
if ((repMatch + minMatch <= dictEnd) && (MEM_readMINMATCH(anchor, minMatch) == MEM_readMINMATCH(repMatch, minMatch)))
|
||||||
mlen = (U32)ZSTD_count_2segments(anchor+minMatch, repMatch+minMatch, iend, dictEnd, prefixStart) + minMatch;
|
mlen = (U32)ZSTD_count_2segments(anchor+minMatch, repMatch+minMatch, iend, dictEnd, prefixStart) + minMatch;
|
||||||
else
|
else
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
offset = rep_2; rep_2 = rep_1; rep_1 = offset; /* swap offset history */
|
offset = rep_2; rep_2 = rep_1; rep_1 = offset; /* swap offset history */
|
||||||
ZSTD_LOG_ENCODE("%d/%d: ENCODE REP literals=%d mlen=%d off=%d rep1=%d rep2=%d\n", (int)(anchor-base), (int)(iend-base), (int)(0), (int)best_mlen, (int)(0), (int)rep_1, (int)rep_2);
|
ZSTD_LOG_ENCODE("%d/%d: ENCODE REP literals=%d mlen=%d off=%d rep1=%d rep2=%d\n", (int)(anchor-base), (int)(iend-base), (int)(0), (int)best_mlen, (int)(0), (int)rep_1, (int)rep_2);
|
||||||
ZSTD_updatePrice(seqStorePtr, 0, anchor, 0, mlen-minMatch);
|
ZSTD_updatePrice(seqStorePtr, 0, anchor, 0, mlen-minMatch);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user