40970636
This commit is contained in:
parent
5391a718a4
commit
e9f30eae4b
@ -610,6 +610,8 @@ typedef struct {
|
|||||||
const BYTE* dumpsEnd;
|
const BYTE* dumpsEnd;
|
||||||
} seqState_t;
|
} seqState_t;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static void ZSTD_decodeSequence(seq_t* seq, seqState_t* seqState)
|
static void ZSTD_decodeSequence(seq_t* seq, seqState_t* seqState)
|
||||||
{
|
{
|
||||||
size_t litLength;
|
size_t litLength;
|
||||||
@ -632,6 +634,11 @@ static void ZSTD_decodeSequence(seq_t* seq, seqState_t* seqState)
|
|||||||
if (dumps >= de) dumps = de-1; /* late correction, to avoid read overflow (data is now corrupted anyway) */
|
if (dumps >= de) dumps = de-1; /* late correction, to avoid read overflow (data is now corrupted anyway) */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// litLength==0 offsetCode==0 offset = seqState->prevOffset seqState->prevOffset = seq->offset
|
||||||
|
// litLength==0 offsetCode>0 seqState->prevOffset = seq->offset;
|
||||||
|
// litLength>0 offsetCode==0
|
||||||
|
// litLength>0 offsetCode>0 seqState->prevOffset = seq->offset;
|
||||||
|
|
||||||
/* Offset */
|
/* Offset */
|
||||||
{
|
{
|
||||||
static const U32 offsetPrefix[MaxOff+1] = {
|
static const U32 offsetPrefix[MaxOff+1] = {
|
||||||
|
188
lib/zstd_opt.c
188
lib/zstd_opt.c
@ -14,6 +14,7 @@ typedef struct
|
|||||||
int mlen;
|
int mlen;
|
||||||
int litlen;
|
int litlen;
|
||||||
int rep;
|
int rep;
|
||||||
|
int rep2;
|
||||||
} LZ5HC_optimal_t;
|
} LZ5HC_optimal_t;
|
||||||
|
|
||||||
#if 1
|
#if 1
|
||||||
@ -26,6 +27,8 @@ typedef struct
|
|||||||
#define LZ5_LOG_ENCODE(fmt, args...) printf(fmt, ##args)
|
#define LZ5_LOG_ENCODE(fmt, args...) printf(fmt, ##args)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#define LZ5_LOG_TRY_PRICE(fmt, args...) ;//printf(fmt, ##args)
|
||||||
|
|
||||||
#define LZ5_OPT_NUM (1<<12)
|
#define LZ5_OPT_NUM (1<<12)
|
||||||
|
|
||||||
|
|
||||||
@ -407,7 +410,7 @@ _storeSequence:
|
|||||||
|
|
||||||
{
|
{
|
||||||
size_t litLength = start - anchor;
|
size_t litLength = start - anchor;
|
||||||
LZ5_LOG_ENCODE("%d/%d: ENCODE literals=%d off=%d mlen=%d\n", (int)(ip-base), (int)(iend-base), (int)(litLength), (int)(offset), (int)matchLength);
|
LZ5_LOG_ENCODE("%d/%d: ENCODE literals=%d off=%d mlen=%d offset_1=%d offset_2=%d\n", (int)(ip-base), (int)(iend-base), (int)(litLength), (int)(offset), (int)matchLength, (int)offset_1, (int)offset_2);
|
||||||
ZSTD_storeSeq(seqStorePtr, litLength, anchor, offset, matchLength-MINMATCH);
|
ZSTD_storeSeq(seqStorePtr, litLength, anchor, offset, matchLength-MINMATCH);
|
||||||
anchor = ip = start + matchLength;
|
anchor = ip = start + matchLength;
|
||||||
}
|
}
|
||||||
@ -501,6 +504,7 @@ void ZSTD_compressBlock_opt_generic(ZSTD_CCtx* ctx,
|
|||||||
LZ5_LOG_PARSER("%d: start try REP rep=%d mlen=%d\n", (int)(ip-base), (int)rep_1, (int)mlen);
|
LZ5_LOG_PARSER("%d: start try REP rep=%d mlen=%d\n", (int)(ip-base), (int)rep_1, (int)mlen);
|
||||||
if (depth==0 || mlen > sufficient_len || mlen >= LZ5_OPT_NUM) {
|
if (depth==0 || mlen > sufficient_len || mlen >= LZ5_OPT_NUM) {
|
||||||
ip+=cur; best_mlen = mlen; best_off = 0; cur = 0; last_pos = 1;
|
ip+=cur; best_mlen = mlen; best_off = 0; cur = 0; last_pos = 1;
|
||||||
|
opt[0].rep = rep_1;
|
||||||
goto _storeSequence;
|
goto _storeSequence;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -529,6 +533,11 @@ void ZSTD_compressBlock_opt_generic(ZSTD_CCtx* ctx,
|
|||||||
LZ5_LOG_PARSER("%d: match_num=%d last_pos=%d\n", (int)(ip-base), match_num, last_pos);
|
LZ5_LOG_PARSER("%d: match_num=%d last_pos=%d\n", (int)(ip-base), match_num, last_pos);
|
||||||
if (!last_pos && !match_num) { ip++; continue; }
|
if (!last_pos && !match_num) { ip++; continue; }
|
||||||
|
|
||||||
|
// opt[0].rep = opt[1].rep = rep_1;
|
||||||
|
// opt[0].mlen = opt[1].mlen = 1;
|
||||||
|
opt[0].rep = opt[0].rep2 = rep_1;
|
||||||
|
opt[0].mlen = 1;
|
||||||
|
|
||||||
if (match_num && matches[match_num-1].len > sufficient_len)
|
if (match_num && matches[match_num-1].len > sufficient_len)
|
||||||
{
|
{
|
||||||
best_mlen = matches[match_num-1].len;
|
best_mlen = matches[match_num-1].len;
|
||||||
@ -561,10 +570,7 @@ void ZSTD_compressBlock_opt_generic(ZSTD_CCtx* ctx,
|
|||||||
|
|
||||||
// printf("%d: last_pos=%d\n", (int)(ip - base), (int)last_pos);
|
// printf("%d: last_pos=%d\n", (int)(ip - base), (int)last_pos);
|
||||||
|
|
||||||
// opt[0].rep = opt[1].rep = rep_1;
|
|
||||||
// opt[0].mlen = opt[1].mlen = 1;
|
|
||||||
opt[0].rep = rep_1;
|
|
||||||
opt[0].mlen = 1;
|
|
||||||
|
|
||||||
|
|
||||||
// check further positions
|
// check further positions
|
||||||
@ -579,65 +585,72 @@ void ZSTD_compressBlock_opt_generic(ZSTD_CCtx* ctx,
|
|||||||
if (cur != litlen)
|
if (cur != litlen)
|
||||||
{
|
{
|
||||||
price = opt[cur - litlen].price + LZ5_LIT_ONLY_COST(litlen);
|
price = opt[cur - litlen].price + LZ5_LIT_ONLY_COST(litlen);
|
||||||
LZ5_LOG_PRICE("%d: TRY1 opt[%d].price=%d price=%d cur=%d litlen=%d\n", (int)(inr-base), cur - litlen, opt[cur - litlen].price, price, cur, litlen);
|
LZ5_LOG_TRY_PRICE("%d: TRY1 opt[%d].price=%d price=%d cur=%d litlen=%d\n", (int)(inr-base), cur - litlen, opt[cur - litlen].price, price, cur, litlen);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
price = LZ5_LIT_ONLY_COST(llen + litlen) - llen;
|
price = LZ5_LIT_ONLY_COST(llen + litlen) - llen;
|
||||||
LZ5_LOG_PRICE("%d: TRY2 price=%d cur=%d litlen=%d llen=%d\n", (int)(inr-base), price, cur, litlen, llen);
|
LZ5_LOG_TRY_PRICE("%d: TRY2 price=%d cur=%d litlen=%d llen=%d\n", (int)(inr-base), price, cur, litlen, llen);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
litlen = 1;
|
litlen = 1;
|
||||||
price = opt[cur - 1].price + LZ5_LIT_ONLY_COST(litlen);
|
price = opt[cur - 1].price + LZ5_LIT_ONLY_COST(litlen);
|
||||||
LZ5_LOG_PRICE("%d: TRY3 price=%d cur=%d litlen=%d litonly=%d\n", (int)(inr-base), price, cur, litlen, LZ5_LIT_ONLY_COST(litlen));
|
LZ5_LOG_TRY_PRICE("%d: TRY3 price=%d cur=%d litlen=%d litonly=%d\n", (int)(inr-base), price, cur, litlen, LZ5_LIT_ONLY_COST(litlen));
|
||||||
}
|
}
|
||||||
|
|
||||||
mlen = 1;
|
mlen = 1;
|
||||||
best_mlen = 0;
|
best_mlen = 0;
|
||||||
LZ5_LOG_PRICE("%d: TRY4 price=%d opt[%d].price=%d\n", (int)(inr-base), price, cur, opt[cur].price);
|
LZ5_LOG_TRY_PRICE("%d: TRY4 price=%d opt[%d].price=%d\n", (int)(inr-base), price, cur, opt[cur].price);
|
||||||
|
|
||||||
if (cur > last_pos || price <= opt[cur].price) // || ((price == opt[cur].price) && (opt[cur-1].mlen == 1) && (cur != litlen)))
|
if (cur > last_pos || price <= opt[cur].price) // || ((price == opt[cur].price) && (opt[cur-1].mlen == 1) && (cur != litlen)))
|
||||||
SET_PRICE(cur, mlen, best_mlen, litlen, price);
|
SET_PRICE(cur, mlen, best_mlen, litlen, price);
|
||||||
|
|
||||||
if (cur == last_pos) break;
|
|
||||||
|
|
||||||
if (opt[cur].mlen > 1)
|
if (opt[cur].mlen > 1)
|
||||||
{
|
{
|
||||||
mlen = opt[cur].mlen;
|
mlen = opt[cur].mlen;
|
||||||
best_off = opt[cur].off;
|
best_off = opt[cur].off;
|
||||||
if (best_off < 1)
|
if (best_off < 1)
|
||||||
{
|
{
|
||||||
opt[cur].rep = opt[cur-mlen].rep;
|
if (opt[cur].off == 0 && opt[cur].litlen==0)
|
||||||
LZ5_LOG_PARSER("%d: COPYREP1 cur=%d mlen=%d rep=%d\n", (int)(inr-base), cur, mlen, opt[cur-mlen].rep);
|
{
|
||||||
|
opt[cur].rep = opt[cur-mlen].rep2;
|
||||||
|
opt[cur].rep2 = opt[cur-mlen].rep;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
opt[cur].rep = opt[cur-mlen].rep;
|
||||||
|
opt[cur].rep2 = opt[cur-mlen].rep2;
|
||||||
|
}
|
||||||
|
LZ5_LOG_PARSER("%d: COPYREP1 cur=%d mlen=%d rep=%d rep2=%d\n", (int)(inr-base), cur, mlen, opt[cur].rep, opt[cur].rep2);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// if (opt[cur].litlen>0)
|
|
||||||
opt[cur].rep = best_off;
|
opt[cur].rep = best_off;
|
||||||
// else
|
opt[cur].rep2 = opt[cur-mlen].rep;
|
||||||
// opt[cur].rep = opt[cur-mlen].rep;
|
LZ5_LOG_PARSER("%d: COPYREP2 cur=%d offset=%d rep=%d rep2=%d litlen=%d\n", (int)(inr-base), cur, 0, opt[cur].rep, opt[cur].rep2, litlen);
|
||||||
LZ5_LOG_PARSER("%d: COPYREP2 cur=%d offset=%d rep=%d\n", (int)(inr-base), cur, 0, opt[cur].rep);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
opt[cur].rep = opt[cur-1].rep; // copy rep
|
opt[cur].rep = opt[cur-1].rep; // copy rep
|
||||||
LZ5_LOG_PARSER("%d: COPYREP3 cur=%d rep=%d\n", (int)(inr-base), cur, opt[cur].rep);
|
opt[cur].rep2 = opt[cur-1].rep; // copy rep
|
||||||
|
LZ5_LOG_PARSER("%d: COPYREP3 cur=%d rep=%d rep2=%d\n", (int)(inr-base), cur, opt[cur].rep, opt[cur].rep2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (cur == last_pos) break;
|
||||||
|
|
||||||
LZ5_LOG_PARSER("%d: CURRENT price[%d/%d]=%d off=%d mlen=%d litlen=%d rep=%d\n", (int)(inr-base), cur, last_pos, opt[cur].price, opt[cur].off, opt[cur].mlen, opt[cur].litlen, opt[cur].rep);
|
LZ5_LOG_PARSER("%d: CURRENT price[%d/%d]=%d off=%d mlen=%d litlen=%d rep=%d rep2=%d\n", (int)(inr-base), cur, last_pos, opt[cur].price, opt[cur].off, opt[cur].mlen, opt[cur].litlen, opt[cur].rep, opt[cur].rep2);
|
||||||
|
|
||||||
#if 1
|
#if 1
|
||||||
// check rep
|
// check rep
|
||||||
// best_mlen = 0;
|
// best_mlen = 0;
|
||||||
mlen = ZSTD_count(inr, inr - opt[cur].rep, iend);
|
mlen = ZSTD_count(inr, inr - opt[cur].rep2, iend);
|
||||||
if (mlen >= MINMATCH && mlen > best_mlen)
|
if (mlen >= MINMATCH && mlen > best_mlen)
|
||||||
{
|
{
|
||||||
LZ5_LOG_PARSER("%d: try REP rep=%d mlen=%d\n", (int)(inr-base), opt[cur].rep, mlen);
|
LZ5_LOG_PARSER("%d: try REP rep=%d mlen=%d\n", (int)(inr-base), opt[cur].rep2, mlen);
|
||||||
LZ5_LOG_PARSER("%d: Found REP mlen=%d off=%d rep=%d opt[%d].off=%d\n", (int)(inr-base), mlen, 0, opt[cur].rep, cur, opt[cur].off);
|
LZ5_LOG_PARSER("%d: Found REP mlen=%d off=%d rep=%d opt[%d].off=%d\n", (int)(inr-base), mlen, 0, opt[cur].rep2, cur, opt[cur].off);
|
||||||
|
|
||||||
if (mlen > sufficient_len || cur + mlen >= LZ5_OPT_NUM)
|
if (mlen > sufficient_len || cur + mlen >= LZ5_OPT_NUM)
|
||||||
{
|
{
|
||||||
@ -655,19 +668,19 @@ void ZSTD_compressBlock_opt_generic(ZSTD_CCtx* ctx,
|
|||||||
if (cur != litlen)
|
if (cur != litlen)
|
||||||
{
|
{
|
||||||
price = opt[cur - litlen].price + LZ5HC_get_price(litlen, 0, mlen - MINMATCH);
|
price = opt[cur - litlen].price + LZ5HC_get_price(litlen, 0, mlen - MINMATCH);
|
||||||
LZ5_LOG_PRICE("%d: TRY1 opt[%d].price=%d price=%d cur=%d litlen=%d\n", (int)(inr-base), cur - litlen, opt[cur - litlen].price, price, cur, litlen);
|
LZ5_LOG_TRY_PRICE("%d: TRY5 opt[%d].price=%d price=%d cur=%d litlen=%d\n", (int)(inr-base), cur - litlen, opt[cur - litlen].price, price, cur, litlen);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
price = LZ5HC_get_price(llen + litlen, 0, mlen - MINMATCH) - LZ5_LIT_COST(llen);
|
price = LZ5HC_get_price(llen + litlen, 0, mlen - MINMATCH) - LZ5_LIT_COST(llen);
|
||||||
LZ5_LOG_PRICE("%d: TRY2 price=%d cur=%d litlen=%d llen=%d\n", (int)(inr-base), price, cur, litlen, llen);
|
LZ5_LOG_TRY_PRICE("%d: TRY6 price=%d cur=%d litlen=%d llen=%d\n", (int)(inr-base), price, cur, litlen, llen);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
litlen = 0;
|
litlen = 0;
|
||||||
price = opt[cur].price + LZ5HC_get_price(litlen, 0, mlen - MINMATCH);
|
price = opt[cur].price + LZ5HC_get_price(litlen, 0, mlen - MINMATCH);
|
||||||
LZ5_LOG_PRICE("%d: TRY3 price=%d cur=%d litlen=%d getprice=%d\n", (int)(inr-base), price, cur, litlen, LZ5HC_get_price(litlen, 0, mlen - MINMATCH));
|
LZ5_LOG_TRY_PRICE("%d: TRY7 price=%d cur=%d litlen=%d getprice=%d\n", (int)(inr-base), price, cur, litlen, LZ5HC_get_price(litlen, 0, mlen - MINMATCH));
|
||||||
}
|
}
|
||||||
|
|
||||||
best_mlen = mlen;
|
best_mlen = mlen;
|
||||||
@ -746,7 +759,7 @@ void ZSTD_compressBlock_opt_generic(ZSTD_CCtx* ctx,
|
|||||||
}
|
}
|
||||||
|
|
||||||
LZ5_LOG_PARSER("%d: Found2 pred=%d mlen=%d best_mlen=%d off=%d price=%d litlen=%d price[%d]=%d\n", (int)(inr-base), matches[i].back, mlen, best_mlen, matches[i].off, price, litlen, cur - litlen, opt[cur - litlen].price);
|
LZ5_LOG_PARSER("%d: Found2 pred=%d mlen=%d best_mlen=%d off=%d price=%d litlen=%d price[%d]=%d\n", (int)(inr-base), matches[i].back, mlen, best_mlen, matches[i].off, price, litlen, cur - litlen, opt[cur - litlen].price);
|
||||||
LZ5_LOG_PRICE("%d: TRY5 price=%d opt[%d].price=%d\n", (int)(inr-base), price, cur2 + mlen, opt[cur2 + mlen].price);
|
LZ5_LOG_TRY_PRICE("%d: TRY8 price=%d opt[%d].price=%d\n", (int)(inr-base), price, cur2 + mlen, opt[cur2 + mlen].price);
|
||||||
if (cur2 + mlen > last_pos || ((matches[i].off != opt[cur2 + mlen].off) && (price < opt[cur2 + mlen].price)))
|
if (cur2 + mlen > last_pos || ((matches[i].off != opt[cur2 + mlen].off) && (price < opt[cur2 + mlen].price)))
|
||||||
{
|
{
|
||||||
SET_PRICE(cur2 + mlen, mlen, matches[i].off, litlen, price);
|
SET_PRICE(cur2 + mlen, mlen, matches[i].off, litlen, price);
|
||||||
@ -754,8 +767,8 @@ void ZSTD_compressBlock_opt_generic(ZSTD_CCtx* ctx,
|
|||||||
// if (opt[cur2].litlen>0)
|
// if (opt[cur2].litlen>0)
|
||||||
opt[cur2 + mlen].rep = matches[i].off; // update reps
|
opt[cur2 + mlen].rep = matches[i].off; // update reps
|
||||||
// else
|
// else
|
||||||
// opt[cur2 + mlen].rep = opt[cur2].rep;
|
// opt[cur2 + mlen].rep = opt[cur2].off;
|
||||||
if (cur2 < cur_min) cur_min = cur2;
|
// if (cur2 < cur_min) cur_min = cur2;
|
||||||
}
|
}
|
||||||
|
|
||||||
mlen++;
|
mlen++;
|
||||||
@ -779,24 +792,24 @@ void ZSTD_compressBlock_opt_generic(ZSTD_CCtx* ctx,
|
|||||||
if (i != litlen)
|
if (i != litlen)
|
||||||
{
|
{
|
||||||
price = opt[i - litlen].price + LZ5_LIT_ONLY_COST(litlen);
|
price = opt[i - litlen].price + LZ5_LIT_ONLY_COST(litlen);
|
||||||
// LZ5_LOG_PRICE("%d: TRY1 opt[%d].price=%d price=%d cur=%d litlen=%d\n", (int)(inr-base), i - litlen, opt[i - litlen].price, price, i, litlen);
|
LZ5_LOG_TRY_PRICE("%d: TRY9 opt[%d].price=%d price=%d cur=%d litlen=%d\n", (int)(inr-base), i - litlen, opt[i - litlen].price, price, i, litlen);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
price = LZ5_LIT_ONLY_COST(llen + litlen) - llen;
|
price = LZ5_LIT_ONLY_COST(llen + litlen) - llen;
|
||||||
// LZ5_LOG_PRICE("%d: TRY2 price=%d cur=%d litlen=%d llen=%d\n", (int)(inr-base), price, i, litlen, llen);
|
LZ5_LOG_TRY_PRICE("%d: TRY10 price=%d cur=%d litlen=%d llen=%d\n", (int)(inr-base), price, i, litlen, llen);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
litlen = 1;
|
litlen = 1;
|
||||||
price = opt[i - 1].price + LZ5_LIT_ONLY_COST(litlen);
|
price = opt[i - 1].price + LZ5_LIT_ONLY_COST(litlen);
|
||||||
// LZ5_LOG_PRICE("%d: TRY3 price=%d cur=%d litlen=%d\n", (int)(inr-base), price, i, litlen);
|
LZ5_LOG_TRY_PRICE("%d: TRY11 price=%d cur=%d litlen=%d\n", (int)(inr-base), price, i, litlen);
|
||||||
}
|
}
|
||||||
|
|
||||||
mlen = 1;
|
mlen = 1;
|
||||||
best_mlen = 0;
|
best_mlen = 0;
|
||||||
LZ5_LOG_PRICE("%d: TRY6 price=%d opt[%d].price=%d\n", (int)(inr-base), price, i + mlen, opt[i + mlen].price);
|
LZ5_LOG_TRY_PRICE("%d: TRY12 price=%d opt[%d].price=%d\n", (int)(inr-base), price, i + mlen, opt[i + mlen].price);
|
||||||
SET_PRICE(i, mlen, best_mlen, litlen, price);
|
SET_PRICE(i, mlen, best_mlen, litlen, price);
|
||||||
|
|
||||||
opt[i].rep = opt[i-1].rep; // copy reps
|
opt[i].rep = opt[i-1].rep; // copy reps
|
||||||
@ -821,7 +834,7 @@ void ZSTD_compressBlock_opt_generic(ZSTD_CCtx* ctx,
|
|||||||
/* store sequence */
|
/* store sequence */
|
||||||
_storeSequence: // cur, last_pos, best_mlen, best_off have to be set
|
_storeSequence: // cur, last_pos, best_mlen, best_off have to be set
|
||||||
for (int i = 1; i <= last_pos; i++)
|
for (int i = 1; i <= last_pos; i++)
|
||||||
LZ5_LOG_PARSER("%d: price[%d/%d]=%d off=%d mlen=%d litlen=%d rep=%d\n", (int)(ip-base+i), i, last_pos, opt[i].price, opt[i].off, opt[i].mlen, opt[i].litlen, opt[i].rep);
|
LZ5_LOG_PARSER("%d: price[%d/%d]=%d off=%d mlen=%d litlen=%d rep=%d rep2=%d\n", (int)(ip-base+i), i, last_pos, opt[i].price, opt[i].off, opt[i].mlen, opt[i].litlen, opt[i].rep, opt[i].rep2);
|
||||||
LZ5_LOG_PARSER("%d: cur=%d/%d best_mlen=%d best_off=%d rep=%d\n", (int)(ip-base+cur), (int)cur, (int)last_pos, (int)best_mlen, (int)best_off, opt[cur].rep);
|
LZ5_LOG_PARSER("%d: cur=%d/%d best_mlen=%d best_off=%d rep=%d\n", (int)(ip-base+cur), (int)cur, (int)last_pos, (int)best_mlen, (int)best_off, opt[cur].rep);
|
||||||
|
|
||||||
opt[0].mlen = 1;
|
opt[0].mlen = 1;
|
||||||
@ -840,7 +853,7 @@ _storeSequence: // cur, last_pos, best_mlen, best_off have to be set
|
|||||||
|
|
||||||
for (int i = 0; i <= last_pos;)
|
for (int i = 0; i <= last_pos;)
|
||||||
{
|
{
|
||||||
LZ5_LOG_PARSER("%d: price2[%d/%d]=%d off=%d mlen=%d litlen=%d rep=%d\n", (int)(ip-base+i), i, last_pos, opt[i].price, opt[i].off, opt[i].mlen, opt[i].litlen, opt[i].rep);
|
LZ5_LOG_PARSER("%d: price2[%d/%d]=%d off=%d mlen=%d litlen=%d rep=%d rep2=%d\n", (int)(ip-base+i), i, last_pos, opt[i].price, opt[i].off, opt[i].mlen, opt[i].litlen, opt[i].rep, opt[i].rep2);
|
||||||
i += opt[i].mlen;
|
i += opt[i].mlen;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -848,65 +861,84 @@ _storeSequence: // cur, last_pos, best_mlen, best_off have to be set
|
|||||||
|
|
||||||
while (cur < last_pos)
|
while (cur < last_pos)
|
||||||
{
|
{
|
||||||
LZ5_LOG_PARSER("%d: price3[%d/%d]=%d off=%d mlen=%d litlen=%d rep=%d\n", (int)(ip-base+cur), cur, last_pos, opt[cur].price, opt[cur].off, opt[cur].mlen, opt[cur].litlen, opt[cur].rep);
|
LZ5_LOG_PARSER("%d: price3[%d/%d]=%d off=%d mlen=%d litlen=%d rep=%d rep2=%d\n", (int)(ip-base+cur), cur, last_pos, opt[cur].price, opt[cur].off, opt[cur].mlen, opt[cur].litlen, opt[cur].rep, opt[cur].rep2);
|
||||||
mlen = opt[cur].mlen;
|
mlen = opt[cur].mlen;
|
||||||
if (mlen == 1) { ip++; cur++; continue; }
|
if (mlen == 1) { ip++; cur++; continue; }
|
||||||
offset = opt[cur].off;
|
offset = opt[cur].off;
|
||||||
|
int cur_rep = opt[cur].rep;
|
||||||
cur += mlen;
|
cur += mlen;
|
||||||
|
|
||||||
#if 1
|
|
||||||
size_t ml2;
|
|
||||||
if (offset)
|
|
||||||
ml2 = ZSTD_count(ip, ip-offset, iend);
|
|
||||||
else
|
|
||||||
ml2 = ZSTD_count(ip, ip-rep_1, iend);
|
|
||||||
if (ml2 < mlen && ml2 < MINMATCH)
|
|
||||||
{
|
|
||||||
printf("ERROR %d: iend=%d mlen=%d offset=%d rep=%d ml2=%d\n", (int)(ip - base), (int)(iend - ip), (int)mlen, (int)offset, (int)rep_1, (int)ml2);
|
|
||||||
exit(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ip < anchor)
|
|
||||||
{
|
|
||||||
printf("ERROR %d: ip < anchor iend=%d mlen=%d offset=%d\n", (int)(ip - base), (int)(iend - ip), (int)mlen, (int)offset);
|
|
||||||
exit(0);
|
|
||||||
}
|
|
||||||
if (ip - offset < base)
|
|
||||||
{
|
|
||||||
printf("ERROR %d: ip - offset < base iend=%d mlen=%d offset=%d\n", (int)(ip - base), (int)(iend - ip), (int)mlen, (int)offset);
|
|
||||||
exit(0);
|
|
||||||
}
|
|
||||||
if (mlen < MINMATCH)
|
|
||||||
{
|
|
||||||
printf("ERROR %d: mlen < MINMATCH iend=%d mlen=%d offset=%d\n", (int)(ip - base), (int)(iend - ip), (int)mlen, (int)offset);
|
|
||||||
exit(0);
|
|
||||||
}
|
|
||||||
if (ip + mlen > iend)
|
|
||||||
{
|
|
||||||
printf("ERROR %d: ip + mlen >= iend iend=%d mlen=%d offset=%d\n", (int)(ip - base), (int)(iend - ip), (int)mlen, (int)offset);
|
|
||||||
exit(0);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
size_t litLength = ip - anchor;
|
size_t litLength = ip - anchor;
|
||||||
LZ5_LOG_ENCODE("%d/%d: ENCODE literals=%d mlen=%d off=%d rep=%d\n", (int)(ip-base), (int)(iend-base), (int)(litLength), (int)mlen, (int)(offset), (int)rep_1);
|
|
||||||
// printf("orig="); print_hex_text(ip, mlen, 0);
|
|
||||||
// printf("match="); print_hex_text(ip-offset, mlen, 0);
|
|
||||||
ZSTD_storeSeq(seqStorePtr, litLength, anchor, offset, mlen-MINMATCH);
|
|
||||||
anchor = ip = ip + mlen;
|
|
||||||
|
|
||||||
if (offset && litLength>0)
|
LZ5_LOG_ENCODE("%d/%d: BEFORE_ENCODE literals=%d mlen=%d off=%d rep1=%d rep2=%d cur_rep=%d\n", (int)(ip-base), (int)(iend-base), (int)(litLength), (int)mlen, (int)(offset), (int)rep_1, (int)rep_2, cur_rep);
|
||||||
|
|
||||||
|
if (rep_1 != cur_rep)
|
||||||
|
{
|
||||||
|
printf("%d: ERROR rep_1=%d rep_2=%d cur_rep=%d\n", (int)(ip - base), (int)rep_1, (int)rep_2, cur_rep);
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (offset)
|
||||||
{
|
{
|
||||||
rep_2 = rep_1;
|
rep_2 = rep_1;
|
||||||
rep_1 = offset;
|
rep_1 = offset;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* best_off = rep_2;
|
if (litLength == 0)
|
||||||
|
{
|
||||||
|
best_off = rep_2;
|
||||||
rep_2 = rep_1;
|
rep_2 = rep_1;
|
||||||
rep_1 = best_off;*/
|
rep_1 = best_off;
|
||||||
}
|
}
|
||||||
LZ5_LOG_PARSER("%d: offset=%d rep=%d\n", (int)(ip-base), (int)offset, (int)rep_1);
|
}
|
||||||
|
|
||||||
|
LZ5_LOG_ENCODE("%d/%d: ENCODE literals=%d mlen=%d off=%d rep1=%d rep2=%d\n", (int)(ip-base), (int)(iend-base), (int)(litLength), (int)mlen, (int)(offset), (int)rep_1, (int)rep_2);
|
||||||
|
// printf("orig="); print_hex_text(ip, mlen, 0);
|
||||||
|
// printf("match="); print_hex_text(ip-offset, mlen, 0);
|
||||||
|
|
||||||
|
#if 1
|
||||||
|
/* size_t ml2;
|
||||||
|
if (offset)
|
||||||
|
ml2 = ZSTD_count(ip, ip-offset, iend);
|
||||||
|
else
|
||||||
|
// if (litLength>0)
|
||||||
|
ml2 = ZSTD_count(ip, ip-rep_1, iend);
|
||||||
|
// else
|
||||||
|
// ml2 = ZSTD_count(ip, ip-rep_2, iend);
|
||||||
|
if (ml2 < mlen && ml2 < MINMATCH)
|
||||||
|
{
|
||||||
|
printf("%d: ERROR iend=%d mlen=%d offset=%d rep=%d ml2=%d\n", (int)(ip - base), (int)(iend - ip), (int)mlen, (int)offset, (int)rep_1, (int)ml2);
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (ip < anchor)
|
||||||
|
{
|
||||||
|
printf("%d: ERROR ip < anchor iend=%d mlen=%d offset=%d\n", (int)(ip - base), (int)(iend - ip), (int)mlen, (int)offset);
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
if (ip - offset < base)
|
||||||
|
{
|
||||||
|
printf("%d: ERROR ip - offset < base iend=%d mlen=%d offset=%d\n", (int)(ip - base), (int)(iend - ip), (int)mlen, (int)offset);
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
if (mlen < MINMATCH)
|
||||||
|
{
|
||||||
|
printf("%d: ERROR mlen < MINMATCH iend=%d mlen=%d offset=%d\n", (int)(ip - base), (int)(iend - ip), (int)mlen, (int)offset);
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
if (ip + mlen > iend)
|
||||||
|
{
|
||||||
|
printf("%d: ERROR ip + mlen >= iend iend=%d mlen=%d offset=%d\n", (int)(ip - base), (int)(iend - ip), (int)mlen, (int)offset);
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
ZSTD_storeSeq(seqStorePtr, litLength, anchor, offset, mlen-MINMATCH);
|
||||||
|
anchor = ip = ip + mlen;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -919,7 +951,7 @@ _storeSequence: // cur, last_pos, best_mlen, best_off have to be set
|
|||||||
best_off = rep_2;
|
best_off = rep_2;
|
||||||
rep_2 = rep_1;
|
rep_2 = rep_1;
|
||||||
rep_1 = best_off;
|
rep_1 = best_off;
|
||||||
LZ5_LOG_ENCODE("%d/%d: ENCODE REP literals=%d off=%d mlen=%d\n", (int)(anchor-base), (int)(iend-base), (int)(0), (int)(rep_1), (int)best_mlen);
|
LZ5_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_storeSeq(seqStorePtr, 0, anchor, 0, best_mlen);
|
ZSTD_storeSeq(seqStorePtr, 0, anchor, 0, best_mlen);
|
||||||
anchor += best_mlen+MINMATCH;
|
anchor += best_mlen+MINMATCH;
|
||||||
ip = anchor;
|
ip = anchor;
|
||||||
|
Loading…
Reference in New Issue
Block a user