const seqStore_t* seqStore = ZSTD_getSeqStore(zc);
const seqDef* seqStoreSeqs = seqStore->sequencesStart;
size_t seqStoreSeqSize = seqStore->sequences - seqStoreSeqs;
+ size_t seqStoreLiteralsSize = (size_t)(seqStore->lit - seqStore->litStart);
+ size_t literalsRead = 0;
+ size_t lastLLSize;
ZSTD_Sequence* outSeqs = &zc->seqCollector.seqStart[zc->seqCollector.seqIndex];
size_t i;
int repIdx;
assert(zc->seqCollector.seqIndex + 1 < zc->seqCollector.maxSequences);
- for (i = 0, position = 0; i < seqStoreSeqSize; ++i) {
+ /* Ensure we have enough space for last literals "sequence" */
+ assert(zc->seqCollector.maxSequences >= seqStoreSeqSize + 1);
+ for (i = 0; i < seqStoreSeqSize; ++i) {
+ literalsRead += seqStoreSeqs[i].litLength;
outSeqs[i].litLength = seqStoreSeqs[i].litLength;
outSeqs[i].matchLength = seqStoreSeqs[i].matchLength + MINMATCH;
} else {
outSeqs[i].offset = seqStoreSeqs[i].offset - ZSTD_REP_NUM;
}
- position += outSeqs[i].litLength + outSeqs[i].matchLength;
}
+
+ /* Insert last literals (if any exist) in the block as a sequence with ml == off == 0 */
+ lastLLSize = seqStoreLiteralsSize - literalsRead;
+ if (lastLLSize) {
+ outSeqs[i].litLength = lastLLSize;
+ outSeqs[i].matchLength = outSeqs[i].offset = outSeqs[i].rep = 0;
+ }
+
zc->seqCollector.seqIndex += seqStoreSeqSize;
}
typedef struct {
unsigned int offset; /* The offset of the match.
- * If == 0, then represents a block of literals, determined by litLength
+ * If == 0, then represents a section of literals of litLength size
*/
unsigned int litLength; /* Literal length */
ZSTDLIB_API size_t ZSTD_frameHeaderSize(const void* src, size_t srcSize);
/*! ZSTD_getSequences() :
- * Extract sequences from the sequence store
+ * Extract sequences from the sequence store. Any last literals in the block will be represented as a sequence
+ * with offset == 0, matchLength == 0, litLength == last literals size.
* zc can be used to insert custom compression params.
* This function invokes ZSTD_compress2
* @return : number of sequences extracted