in csharp/src/HufDecompress.cs [695:741]
public static void HUF_fillDTableX4Level2(HUF_DEltX4* DTable, U32 sizeLog, U32 consumed,
U32* rankValOrigin, int minWeight,
sortedSymbol_t* sortedSymbols, U32 sortedListSize,
U32 nbBitsBaseline, U16 baseSeq)
{
HUF_DEltX4 DElt;
U32* rankVal = stackalloc U32[(int)HUF_TABLELOG_MAX + 1];
/* get pre-calculated rankVal */
memcpy(rankVal, rankValOrigin, sizeof(U32) * (HUF_TABLELOG_MAX + 1));
/* fill skipped values */
if (minWeight > 1)
{
U32 i, skipSize = rankVal[minWeight];
DElt.sequence = baseSeq; // MEM_writeLE16(&(DElt.sequence), baseSeq);
DElt.nbBits = (BYTE)(consumed);
DElt.length = 1;
for (i = 0; i < skipSize; i++)
DTable[i] = DElt;
}
/* fill DTable */
{
U32 s;
for (s = 0; s < sortedListSize; s++)
{
/* note : sortedSymbols already skipped */
U32 symbol = sortedSymbols[s].symbol;
U32 weight = sortedSymbols[s].weight;
U32 nbBits = nbBitsBaseline - weight;
U32 length = (U32)1 << (int)(sizeLog - nbBits);
U32 start = rankVal[weight];
U32 i = start;
U32 end = start + length;
DElt.sequence = (U16)(baseSeq + (symbol << 8)); // MEM_writeLE16(&(DElt.sequence), (U16)(baseSeq + (symbol << 8)));
DElt.nbBits = (BYTE)(nbBits + consumed);
DElt.length = 2;
do
{
DTable[i++] = DElt;
} while (i < end); /* since length >= 1 */
rankVal[weight] += length;
}
}
}