Add enum for representing long length ID
This commit is contained in:
parent
f8ac0ea7ef
commit
b1a43455f8
@ -357,6 +357,13 @@ typedef struct seqDef_s {
|
|||||||
U16 matchLength;
|
U16 matchLength;
|
||||||
} seqDef;
|
} seqDef;
|
||||||
|
|
||||||
|
/* Controls whether seqStore has a single "long" litLength or matchLength. See seqStore_t. */
|
||||||
|
typedef enum {
|
||||||
|
ZSTD_llt_none = 0, /* no longLengthType */
|
||||||
|
ZSTD_llt_literalLength = 1, /* represents a long literal */
|
||||||
|
ZSTD_llt_matchLength = 2 /* represents a long match */
|
||||||
|
} ZSTD_longLengthType_e;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
seqDef* sequencesStart;
|
seqDef* sequencesStart;
|
||||||
seqDef* sequences; /* ptr to end of sequences */
|
seqDef* sequences; /* ptr to end of sequences */
|
||||||
@ -368,12 +375,12 @@ typedef struct {
|
|||||||
size_t maxNbSeq;
|
size_t maxNbSeq;
|
||||||
size_t maxNbLit;
|
size_t maxNbLit;
|
||||||
|
|
||||||
/* longLengthPos and longLengthID to allow us to represent either a single litLength or matchLength
|
/* longLengthPos and longLengthType to allow us to represent either a single litLength or matchLength
|
||||||
* in the seqStore that has a value larger than U16 (if it exists). To do so, we increment
|
* in the seqStore that has a value larger than U16 (if it exists). To do so, we increment
|
||||||
* the existing value of the litLength or matchLength by 0x10000.
|
* the existing value of the litLength or matchLength by 0x10000.
|
||||||
*/
|
*/
|
||||||
U32 longLengthID; /* 0 == no longLength; 1 == Represent the long literal; 2 == Represent the long match; */
|
ZSTD_longLengthType_e longLengthType;
|
||||||
U32 longLengthPos; /* Index of the sequence to apply long length modification to */
|
U32 longLengthPos; /* Index of the sequence to apply long length modification to */
|
||||||
} seqStore_t;
|
} seqStore_t;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
@ -383,7 +390,7 @@ typedef struct {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the ZSTD_sequenceLength for the given sequences. It handles the decoding of long sequences
|
* Returns the ZSTD_sequenceLength for the given sequences. It handles the decoding of long sequences
|
||||||
* indicated by longLengthPos and longLengthID, and adds MINMATCH back to matchLength.
|
* indicated by longLengthPos and longLengthType, and adds MINMATCH back to matchLength.
|
||||||
*/
|
*/
|
||||||
MEM_STATIC ZSTD_sequenceLength ZSTD_getSequenceLength(seqStore_t const* seqStore, seqDef const* seq)
|
MEM_STATIC ZSTD_sequenceLength ZSTD_getSequenceLength(seqStore_t const* seqStore, seqDef const* seq)
|
||||||
{
|
{
|
||||||
@ -391,10 +398,10 @@ MEM_STATIC ZSTD_sequenceLength ZSTD_getSequenceLength(seqStore_t const* seqStore
|
|||||||
seqLen.litLength = seq->litLength;
|
seqLen.litLength = seq->litLength;
|
||||||
seqLen.matchLength = seq->matchLength + MINMATCH;
|
seqLen.matchLength = seq->matchLength + MINMATCH;
|
||||||
if (seqStore->longLengthPos == (U32)(seq - seqStore->sequencesStart)) {
|
if (seqStore->longLengthPos == (U32)(seq - seqStore->sequencesStart)) {
|
||||||
if (seqStore->longLengthID == 1) {
|
if (seqStore->longLengthType == ZSTD_llt_literalLength) {
|
||||||
seqLen.litLength += 0xFFFF;
|
seqLen.litLength += 0xFFFF;
|
||||||
}
|
}
|
||||||
if (seqStore->longLengthID == 2) {
|
if (seqStore->longLengthType == ZSTD_llt_matchLength) {
|
||||||
seqLen.matchLength += 0xFFFF;
|
seqLen.matchLength += 0xFFFF;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2197,9 +2197,9 @@ void ZSTD_seqToCodes(const seqStore_t* seqStorePtr)
|
|||||||
ofCodeTable[u] = (BYTE)ZSTD_highbit32(sequences[u].offset);
|
ofCodeTable[u] = (BYTE)ZSTD_highbit32(sequences[u].offset);
|
||||||
mlCodeTable[u] = (BYTE)ZSTD_MLcode(mlv);
|
mlCodeTable[u] = (BYTE)ZSTD_MLcode(mlv);
|
||||||
}
|
}
|
||||||
if (seqStorePtr->longLengthID==1)
|
if (seqStorePtr->longLengthType==ZSTD_llt_literalLength)
|
||||||
llCodeTable[seqStorePtr->longLengthPos] = MaxLL;
|
llCodeTable[seqStorePtr->longLengthPos] = MaxLL;
|
||||||
if (seqStorePtr->longLengthID==2)
|
if (seqStorePtr->longLengthType==ZSTD_llt_matchLength)
|
||||||
mlCodeTable[seqStorePtr->longLengthPos] = MaxML;
|
mlCodeTable[seqStorePtr->longLengthPos] = MaxML;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2571,7 +2571,7 @@ void ZSTD_resetSeqStore(seqStore_t* ssPtr)
|
|||||||
{
|
{
|
||||||
ssPtr->lit = ssPtr->litStart;
|
ssPtr->lit = ssPtr->litStart;
|
||||||
ssPtr->sequences = ssPtr->sequencesStart;
|
ssPtr->sequences = ssPtr->sequencesStart;
|
||||||
ssPtr->longLengthID = 0;
|
ssPtr->longLengthType = ZSTD_llt_none;
|
||||||
}
|
}
|
||||||
|
|
||||||
typedef enum { ZSTDbss_compress, ZSTDbss_noCompress } ZSTD_buildSeqStore_e;
|
typedef enum { ZSTDbss_compress, ZSTDbss_noCompress } ZSTD_buildSeqStore_e;
|
||||||
@ -2677,9 +2677,9 @@ static void ZSTD_copyBlockSequences(ZSTD_CCtx* zc)
|
|||||||
outSeqs[i].rep = 0;
|
outSeqs[i].rep = 0;
|
||||||
|
|
||||||
if (i == seqStore->longLengthPos) {
|
if (i == seqStore->longLengthPos) {
|
||||||
if (seqStore->longLengthID == 1) {
|
if (seqStore->longLengthType == ZSTD_llt_literalLength) {
|
||||||
outSeqs[i].litLength += 0x10000;
|
outSeqs[i].litLength += 0x10000;
|
||||||
} else if (seqStore->longLengthID == 2) {
|
} else if (seqStore->longLengthType == ZSTD_llt_matchLength) {
|
||||||
outSeqs[i].matchLength += 0x10000;
|
outSeqs[i].matchLength += 0x10000;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -3116,7 +3116,7 @@ static size_t ZSTD_countSeqStoreLiteralsBytes(const seqStore_t* const seqStore)
|
|||||||
for (i = 0; i < nbSeqs; ++i) {
|
for (i = 0; i < nbSeqs; ++i) {
|
||||||
seqDef seq = seqStore->sequencesStart[i];
|
seqDef seq = seqStore->sequencesStart[i];
|
||||||
literalsBytes += seq.litLength;
|
literalsBytes += seq.litLength;
|
||||||
if (i == seqStore->longLengthPos && seqStore->longLengthID == 1) {
|
if (i == seqStore->longLengthPos && seqStore->longLengthType == ZSTD_llt_literalLength) {
|
||||||
literalsBytes += 0x10000;
|
literalsBytes += 0x10000;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -3131,7 +3131,7 @@ static size_t ZSTD_countSeqStoreMatchBytes(const seqStore_t* const seqStore) {
|
|||||||
for (i = 0; i < nbSeqs; ++i) {
|
for (i = 0; i < nbSeqs; ++i) {
|
||||||
seqDef seq = seqStore->sequencesStart[i];
|
seqDef seq = seqStore->sequencesStart[i];
|
||||||
matchBytes += seq.matchLength + MINMATCH;
|
matchBytes += seq.matchLength + MINMATCH;
|
||||||
if (i == seqStore->longLengthPos && seqStore->longLengthID == 2) {
|
if (i == seqStore->longLengthPos && seqStore->longLengthType == ZSTD_llt_matchLength) {
|
||||||
matchBytes += 0x10000;
|
matchBytes += 0x10000;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -3155,9 +3155,9 @@ static void ZSTD_deriveSeqStoreChunk(seqStore_t* resultSeqStore,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Move longLengthPos into the correct position if necessary */
|
/* Move longLengthPos into the correct position if necessary */
|
||||||
if (originalSeqStore->longLengthID != 0) {
|
if (originalSeqStore->longLengthType != ZSTD_llt_none) {
|
||||||
if (originalSeqStore->longLengthPos < startIdx || originalSeqStore->longLengthPos > endIdx) {
|
if (originalSeqStore->longLengthPos < startIdx || originalSeqStore->longLengthPos > endIdx) {
|
||||||
resultSeqStore->longLengthID = 0;
|
resultSeqStore->longLengthType = ZSTD_llt_none;
|
||||||
} else {
|
} else {
|
||||||
resultSeqStore->longLengthPos -= (U32)startIdx;
|
resultSeqStore->longLengthPos -= (U32)startIdx;
|
||||||
}
|
}
|
||||||
|
@ -597,8 +597,8 @@ void ZSTD_storeSeq(seqStore_t* seqStorePtr, size_t litLength, const BYTE* litera
|
|||||||
|
|
||||||
/* literal Length */
|
/* literal Length */
|
||||||
if (litLength>0xFFFF) {
|
if (litLength>0xFFFF) {
|
||||||
assert(seqStorePtr->longLengthID == 0); /* there can only be a single long length */
|
assert(seqStorePtr->longLengthType == ZSTD_llt_none); /* there can only be a single long length */
|
||||||
seqStorePtr->longLengthID = 1;
|
seqStorePtr->longLengthType = ZSTD_llt_literalLength;
|
||||||
seqStorePtr->longLengthPos = (U32)(seqStorePtr->sequences - seqStorePtr->sequencesStart);
|
seqStorePtr->longLengthPos = (U32)(seqStorePtr->sequences - seqStorePtr->sequencesStart);
|
||||||
}
|
}
|
||||||
seqStorePtr->sequences[0].litLength = (U16)litLength;
|
seqStorePtr->sequences[0].litLength = (U16)litLength;
|
||||||
@ -608,8 +608,8 @@ void ZSTD_storeSeq(seqStore_t* seqStorePtr, size_t litLength, const BYTE* litera
|
|||||||
|
|
||||||
/* match Length */
|
/* match Length */
|
||||||
if (mlBase>0xFFFF) {
|
if (mlBase>0xFFFF) {
|
||||||
assert(seqStorePtr->longLengthID == 0); /* there can only be a single long length */
|
assert(seqStorePtr->longLengthType == ZSTD_llt_none); /* there can only be a single long length */
|
||||||
seqStorePtr->longLengthID = 2;
|
seqStorePtr->longLengthType = ZSTD_llt_matchLength;
|
||||||
seqStorePtr->longLengthPos = (U32)(seqStorePtr->sequences - seqStorePtr->sequencesStart);
|
seqStorePtr->longLengthPos = (U32)(seqStorePtr->sequences - seqStorePtr->sequencesStart);
|
||||||
}
|
}
|
||||||
seqStorePtr->sequences[0].matchLength = (U16)mlBase;
|
seqStorePtr->sequences[0].matchLength = (U16)mlBase;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user