* LDM util functions
*********************************/
-static void ldm_skipOvershotBytes(rawSeqStore_t* rawSeqStore, size_t posOvershoot) {
+/*
+static void ldm_skipOvershotBytes(rawSeqStore_t* rawSeqStore, U32 bytesOvershot) {
+ while (bytesOvershot > 0 && rawSeqStore->pos < rawSeqStore->size) {
+ rawSeq seq = rawSeqStore->seq[rawSeqStore->pos];
+ if (bytesOvershot <= seq.litLength) {
+ seq->litLength -= bytesOvershot;
+ }
+ }
if (rawSeqStore->seq[rawSeqStore->pos].matchLength > posOvershoot) {
rawSeqStore->seq[rawSeqStore->pos].matchLength -= posOvershoot;
return;
while (posOvershoot > 0 && rawSeqStore->pos < rawSeqStore->size) {
}
-}
+}*/
static void ldm_skipSequences(rawSeqStore_t* rawSeqStore, size_t srcSize, U32 const minMatch) {
while (srcSize > 0 && rawSeqStore->pos < rawSeqStore->size) {
+ printf("ldm_skipSequences(): %u remaining\n", srcSize);
rawSeq* seq = rawSeqStore->seq + rawSeqStore->pos;
+ printf("ldm_skipSequences(): before: (of: %u, ml: %u, ll: %u)\n", seq->offset, seq->matchLength, seq->litLength);
if (srcSize <= seq->litLength) {
/* Skip past srcSize literals */
seq->litLength -= (U32)srcSize;
+ printf("ldm_skipSequences(): final: (of: %u, ml: %u, ll: %u)\n", seq->offset, seq->matchLength, seq->litLength);
return;
}
srcSize -= seq->litLength;
}
rawSeqStore->pos++;
}
+ printf("ldm_skipSequences(): final: (of: %u, ml: %u, ll: %u)\n", seq->offset, seq->matchLength, seq->litLength);
return;
}
srcSize -= seq->matchLength;
if (posDiff > 0)
return; // dont deal with extra ldms for now
assert(posDiff < matchEndPosInBlock - matchStartPosInBlock);
- U32 matchLengthAdjusted = matchEndPosInBlock - matchStartPosInBlock - posDiff;
- U32 matchOffsetAdjusted = matchOffset + posDiff;
-
- if (*nbMatches == 0 || matchLengthAdjusted >= matches[*nbMatches-1].len) {
- printf("Adding LDM with of: %u, ml: %u @ currposinblock: %u, current: %u, currposinblock+sbi: %u\n", matchOffsetAdjusted, matchLengthAdjusted, currPosInBlock, curr, currPosInBlock+sbi);
- /* Add sifting */
- matches[*nbMatches].len = matchLengthAdjusted;
- matches[*nbMatches].off = matchOffsetAdjusted + ZSTD_REP_MOVE;
- (*nbMatches)++;
- } else {
- printf("too small ldm\n");
+ U32 candidateMatchLength = matchEndPosInBlock - matchStartPosInBlock - posDiff;
+ U32 candidateOffCode = matchOffset + posDiff + ZSTD_REP_MOVE;
+
+ if ((*nbMatches == 0 || candidateMatchLength >= matches[*nbMatches-1].len) && *nbMatches < ZSTD_OPT_NUM) {
+ printf("large enough, adding\n");
+ /*matches[*nbMatches].len = candidateMatchLength;
+ matches[*nbMatches].off = candidateOffCode;
+ (*nbMatches)++;*/
+
+ if (*nbMatches == 0) {
+ matches[*nbMatches].len = candidateMatchLength;
+ matches[*nbMatches].off = candidateOffCode;
+ (*nbMatches)++;
+ } else {
+ if (candidateMatchLength == matches[*nbMatches-1].len) {
+ U32 candidateMatchIdx = *nbMatches;
+ matches[*nbMatches].len = candidateMatchLength;
+ matches[*nbMatches].off = candidateOffCode;
+ printf("Sifting...: idx: %u, len: %u, off: %u\n", candidateMatchIdx, candidateMatchLength, candidateOffCode);
+ //printf("Current best is...: idx: %u, len: %u, off: %u\n", *nbMatches-1, matches[*nbMatches-1].len, matches[*nbMatches-1].off);
+ if (candidateOffCode != matches[*nbMatches].off)
+ printf("DIFF: ldm: (len: %u, off: %u), best: (len: %u, off: %u)\n", candidateMatchLength, candidateOffCode, matches[*nbMatches-1].len, matches[*nbMatches-1].off);
+ //printf("Current best is...: idx: %u, len: %u, off: %u\n", *nbMatches-1, matches[*nbMatches-1].len, matches[*nbMatches-1].off);
+ while (candidateMatchIdx > 0 &&
+ matches[candidateMatchIdx].off > matches[candidateMatchIdx - 1].off &&
+ matches[candidateMatchIdx].len == matches[candidateMatchIdx - 1].len) {
+ //printf("Compared to: idx: %u, len: %u, off: %u", candidateMatchIdx - 1, matches[candidateMatchIdx - 1].len, matches[candidateMatchIdx - 1].off);
+ ZSTD_match_t tmp = matches[candidateMatchIdx - 1];
+ matches[candidateMatchIdx - 1] = matches[candidateMatchIdx];
+ matches[candidateMatchIdx] = tmp;
+ --candidateMatchIdx;
+ }
+ (*nbMatches)++;
+ } else {
+ printf("MATCHDIFF: ldm: (len: %u, off: %u), best: (len: %u, off: %u)\n", candidateMatchLength, candidateOffCode, matches[*nbMatches-1].len, matches[*nbMatches-1].off);
+ matches[*nbMatches].len = candidateMatchLength;
+ matches[*nbMatches].off = candidateOffCode;
+ (*nbMatches)++;
+ }
+ }
}
}
ldm_skipSequences(ldmSeqStore, posOvershoot, MINMATCH);
int noMoreLdms = ldm_getNextMatch(ldmSeqStore, matchStartPosInBlock,
matchEndPosInBlock, matchOffset,
- matchEndPosInBlock, remainingBytes, sbi);
+ currPosInBlock, remainingBytes, sbi);
} else {
int noMoreLdms = ldm_getNextMatch(ldmSeqStore, matchStartPosInBlock,
matchEndPosInBlock, matchOffset,