in csharp/src/HufDecompress.cs [761:809]
public static void HUF_fillDTableX4(HUF_DEltX4* DTable, U32 targetLog,
sortedSymbol_t* sortedList, U32 sortedListSize,
U32* rankStart, U32* rankValOrigin, U32 maxWeight,
U32 nbBitsBaseline)
{
U32* rankVal = stackalloc U32[(int)HUF_TABLELOG_MAX + 1];
int scaleLog = (int)(nbBitsBaseline - targetLog); /* note : targetLog >= srcLog, hence scaleLog <= 1 */
U32 minBits = nbBitsBaseline - maxWeight;
U32 s;
memcpy(rankVal, rankValOrigin, sizeof(U32) * (HUF_TABLELOG_MAX + 1));
/* fill DTable */
for (s = 0; s < sortedListSize; s++)
{
U16 symbol = sortedList[s].symbol;
U32 weight = sortedList[s].weight;
U32 nbBits = nbBitsBaseline - weight;
U32 start = rankVal[weight];
U32 length = (U32)1 << (int)(targetLog - nbBits);
if (targetLog - nbBits >= minBits)
{
/* enough room for a second symbol */
U32 sortedRank;
int minWeight = (int)(nbBits + scaleLog);
if (minWeight < 1) minWeight = 1;
sortedRank = rankStart[minWeight];
HUF_fillDTableX4Level2(DTable + start, targetLog - nbBits, nbBits,
rankValOrigin + nbBits * (HUF_TABLELOG_MAX + 1), minWeight,
sortedList + sortedRank, sortedListSize - sortedRank,
nbBitsBaseline, symbol);
}
else
{
HUF_DEltX4 DElt;
DElt.sequence = symbol;//MEM_writeLE16(&(DElt.sequence), symbol);
DElt.nbBits = (BYTE)(nbBits);
DElt.length = 1;
{
U32 end = start + length;
U32 u;
for (u = start; u < end; u++) DTable[u] = DElt;
}
}
rankVal[weight] += length;
}
}