static size_t ZSTD_execSequenceLast7()

in csharp/src/ZStdDecompress.cs [1212:1260]


		static size_t ZSTD_execSequenceLast7(BYTE* op,
									  BYTE* oend, seq_t sequence,
									  BYTE** litPtr, BYTE* litLimit,
									  BYTE* baseField, BYTE* vBase, BYTE* dictEnd)
		{
			BYTE* oLitEnd = op + sequence.litLength;
			size_t sequenceLength = sequence.litLength + sequence.matchLength;
			BYTE* oMatchEnd = op + sequenceLength;   /* risk : address space overflow (32-bits) */
			BYTE* oend_w = oend - WILDCOPY_OVERLENGTH;
			BYTE* iLitEnd = *litPtr + sequence.litLength;
			BYTE* match = oLitEnd - sequence.offset;

			/* check */
			if (oMatchEnd > oend) return ERROR(Error.dstSize_tooSmall); /* last match must start at a minimum distance of  WILDCOPY_OVERLENGTH from oend */
			if (iLitEnd > litLimit) return ERROR(Error.corruption_detected);   /* over-read beyond lit buffer */
			if (oLitEnd <= oend_w) return ERROR(Error.GENERIC);   /* Precondition */

			/* copy literals */
			if (op < oend_w)
			{
				Wildcopy(op, *litPtr, (int)(oend_w - op));
				*litPtr += oend_w - op;
				op = oend_w;
			}
			while (op < oLitEnd) *op++ = *(*litPtr)++;

			/* copy Match */
			if (sequence.offset > (size_t)(oLitEnd - baseField))
			{
				/* offset beyond prefix */
				if (sequence.offset > (size_t)(oLitEnd - vBase)) return ERROR(Error.corruption_detected);
				match = dictEnd - (baseField - match);
				if (match + sequence.matchLength <= dictEnd)
				{
					memmove(oLitEnd, match, sequence.matchLength);
					return sequenceLength;
				}
				/* span extDict & currentPrefixSegment */
				{
					size_t length1 = (size_t)(dictEnd - match);
					memmove(oLitEnd, match, length1);
					op = oLitEnd + length1;
					sequence.matchLength -= length1;
					match = baseField;
				}
			}
			while (op < oMatchEnd) *op++ = *match++;
			return sequenceLength;
		}