From: senhuang42 Date: Mon, 2 Nov 2020 21:59:16 +0000 (-0500) Subject: Change block delimiter removing to linear time approach X-Git-Tag: v1.4.7~34^2~4 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f782cac3d4b93739b918bc20c3d458febbe81a58;p=thirdparty%2Fzstd.git Change block delimiter removing to linear time approach --- diff --git a/lib/compress/zstd_compress.c b/lib/compress/zstd_compress.c index 7571261a4..928f8fef0 100644 --- a/lib/compress/zstd_compress.c +++ b/lib/compress/zstd_compress.c @@ -2569,22 +2569,22 @@ size_t ZSTD_getSequences(ZSTD_CCtx* zc, ZSTD_Sequence* outSeqs, ZSTD_customFree(dst, ZSTD_defaultCMem); if (format == ZSTD_sf_noBlockDelimiters) { - size_t i = 0; - size_t totalSeqs = zc->seqCollector.seqIndex; - while(i < totalSeqs) { - if (seqCollector.seqStart[i].offset == 0 && seqCollector.seqStart[i].matchLength == 0) { - /* Merge the block boundary or last literals */ - if (i != totalSeqs-1) { - /* Add last literals to next sequence, then "delete" this sequence */ - seqCollector.seqStart[i+1].litLength += seqCollector.seqStart[i].litLength; - ZSTD_memmove(seqCollector.seqStart+i, seqCollector.seqStart+i+1, (totalSeqs-i-1)*sizeof(ZSTD_Sequence)); + /* Remove all block delimiters and append them to the next sequence's literals + * and do not emit last literals at all + */ + size_t in = 0; + size_t out = 0; + for (; in < zc->seqCollector.seqIndex; ++in) { + if (seqCollector.seqStart[in].offset == 0 && seqCollector.seqStart[in].matchLength == 0) { + if (in != zc->seqCollector.seqIndex - 1) { + seqCollector.seqStart[in+1].litLength += seqCollector.seqStart[in].litLength; } - totalSeqs--; } else { - ++i; + seqCollector.seqStart[out] = seqCollector.seqStart[in]; + ++out; } } - zc->seqCollector.seqIndex = totalSeqs; + zc->seqCollector.seqIndex = out; } return zc->seqCollector.seqIndex;