ssPtr->longLengthID = 0;
}
+typedef struct {
+ U32 matchPos;
+ U32 offset;
+ U32 litLength;
+ U32 matchLength;
+ int rep;
+} Sequence;
+
+static size_t ZSTD_getSequencesForOneBlock(ZSTD_CCtx* zc, ZSTD_CDict* cdict,
+ void* dst, size_t dstSize,
+ const void* src, size_t srcSize,
+ Sequence* outSeqs, size_t outSeqsSize)
+{
+ const seqStore_t* seqStore;
+ const seqDef* seqs;
+ size_t seqsSize;
+
+ int i; int repIdx; U32 position;
+
+ size_t blockSize = ZSTD_getBlockSize(zc);
+ size_t maxOutput = ZSTD_compressBound(blockSize);
+
+ ASSERT(!ZSTD_isError(ZSTD_compressBegin_usingCDict(zc, cdict)));
+ ASSERT(dstSize >= maxOutput); dstSize = maxOutput;
+ ASSERT(srcSize >= blockSize); srcSize = blockSize;
+ ASSERT(!ZSTD_isError(ZSTD_compressBlock(zc, dst, dstSize, src, srcSize)));
+
+ seqStore = ZSTD_getSeqStore(zc);
+ seqs = seqStore->sequencesStart;
+ seqsSize = seqStore->sequences - seqStore->sequencesStart;
+
+ ASSERT(outSeqsSize >= seqsSize); outSeqsSize = seqsSize;
+
+ for (i = 0, position = 0; i < seqsSize; ++i) {
+ outSeqs[i].offset = seqs[i].offset;
+ outSeqs[i].litLength = seqs[i].litLength;
+ outSeqs[i].matchLength = seqs[i].matchLength + 3 /* min match */;
+
+ if (i == seqStore->longLengthPos) {
+ if (seqStore->longLengthID == 1) {
+ outSeqs[i].litLength += 0x10000;
+ } else if (seqStore->longLengthID == 2) {
+ outSeqs[i].matchLength += 0x10000;
+ }
+ }
+
+ if (outSeqs[i].offset <= 3 /* num reps */) {
+ outSeqs[i].rep = 1;
+ repIdx = i - outSeqs[i].offset;
+
+ if (repIdx >= 0) {
+ outSeqs[i].offset = outSeqs[repIdx].offset;
+ }
+
+ if (repIdx == -1) {
+ outSeqs[i].offset = 1;
+ } else if (repIdx == -2) {
+ outSeqs[i].offset = 4;
+ } else if (repIdx == -3) {
+ outSeqs[i].offset = 8;
+ }
+ } else {
+ outSeqs[i].offset -= 3 /* num reps */;
+ }
+
+ position += outSeqs[i].litLength;
+ outSeqs[i].matchPos = position;
+ position += outSeqs[i].matchLength;
+ }
+}
+
typedef enum { ZSTDbss_compress, ZSTDbss_noCompress } ZSTD_buildSeqStore_e;
static size_t ZSTD_buildSeqStore(ZSTD_CCtx* zc, const void* src, size_t srcSize)