in csharp/src/ZStdDecompress.cs [1040:1079]
static size_t BuildSeqTable(SeqSymbol* DTableSpace, ref SeqSymbol* DTablePtr,
symbolEncodingType_e type, U32 max, U32 maxLog,
void* src, size_t srcSize,
U32[] baseValue, U32[] nbAdditionalBits,
SeqSymbol* defaultTable, U32 flagRepeatTable)
{
switch (type)
{
case symbolEncodingType_e.set_rle:
if (srcSize == 0) return ERROR(Error.srcSize_wrong);
if ((*(BYTE*)src) > max) return ERROR(Error.corruption_detected);
{
U32 symbol = *(BYTE*)src;
U32 baseline = baseValue[symbol];
U32 nbBits = nbAdditionalBits[symbol];
ZSTD_buildSeqTable_rle(DTableSpace, baseline, nbBits);
}
DTablePtr = DTableSpace;
return 1;
case symbolEncodingType_e.set_basic:
DTablePtr = defaultTable;
return 0;
case symbolEncodingType_e.set_repeat:
if (flagRepeatTable == 0) return ERROR(Error.corruption_detected);
return 0;
case symbolEncodingType_e.set_compressed:
{
U32 tableLog;
S16[] norm = new S16[MaxSeq + 1];
size_t headerSize = ReadNCount(norm, &max, &tableLog, src, srcSize);
if (IsError(headerSize)) return ERROR(Error.corruption_detected);
if (tableLog > maxLog) return ERROR(Error.corruption_detected);
BuildFSETable(DTableSpace, norm, max, baseValue, nbAdditionalBits, tableLog);
DTablePtr = DTableSpace;
return headerSize;
}
default: /* impossible */
return ERROR(Error.GENERIC);
}
}