MCPcopy Create free account
hub / github.com/F-Stack/f-stack / HUF_readCTable

Function HUF_readCTable

freebsd/contrib/openzfs/module/zstd/lib/zstd.c:8514–8562  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

8512
8513
8514size_t HUF_readCTable (HUF_CElt* CTable, unsigned* maxSymbolValuePtr, const void* src, size_t srcSize, unsigned* hasZeroWeights)
8515{
8516 BYTE huffWeight[HUF_SYMBOLVALUE_MAX + 1]; /* init not required, even though some static analyzer may complain */
8517 U32 rankVal[HUF_TABLELOG_ABSOLUTEMAX + 1]; /* large enough for values from 0 to 16 */
8518 U32 tableLog = 0;
8519 U32 nbSymbols = 0;
8520
8521 /* get symbol weights */
8522 CHECK_V_F(readSize, HUF_readStats(huffWeight, HUF_SYMBOLVALUE_MAX+1, rankVal, &nbSymbols, &tableLog, src, srcSize));
8523
8524 /* check result */
8525 if (tableLog > HUF_TABLELOG_MAX) return ERROR(tableLog_tooLarge);
8526 if (nbSymbols > *maxSymbolValuePtr+1) return ERROR(maxSymbolValue_tooSmall);
8527
8528 /* Prepare base value per rank */
8529 { U32 n, nextRankStart = 0;
8530 for (n=1; n<=tableLog; n++) {
8531 U32 current = nextRankStart;
8532 nextRankStart += (rankVal[n] << (n-1));
8533 rankVal[n] = current;
8534 } }
8535
8536 /* fill nbBits */
8537 *hasZeroWeights = 0;
8538 { U32 n; for (n=0; n<nbSymbols; n++) {
8539 const U32 w = huffWeight[n];
8540 *hasZeroWeights |= (w == 0);
8541 CTable[n].nbBits = (BYTE)(tableLog + 1 - w) & -(w != 0);
8542 } }
8543
8544 /* fill val */
8545 { U16 nbPerRank[HUF_TABLELOG_MAX+2] = {0}; /* support w=0=>n=tableLog+1 */
8546 U16 valPerRank[HUF_TABLELOG_MAX+2] = {0};
8547 { U32 n; for (n=0; n<nbSymbols; n++) nbPerRank[CTable[n].nbBits]++; }
8548 /* determine stating value per rank */
8549 valPerRank[tableLog+1] = 0; /* for w==0 */
8550 { U16 min = 0;
8551 U32 n; for (n=tableLog; n>0; n--) { /* start at n=tablelog <-> w=1 */
8552 valPerRank[n] = min; /* get starting value within each rank */
8553 min += nbPerRank[n];
8554 min >>= 1;
8555 } }
8556 /* assign value within rank, symbol order */
8557 { U32 n; for (n=0; n<nbSymbols; n++) CTable[n].val = valPerRank[CTable[n].nbBits]++; }
8558 }
8559
8560 *maxSymbolValuePtr = nbSymbols - 1;
8561 return readSize;
8562}
8563
8564U32 HUF_getNbBits(const void* symbolTable, U32 symbolValue)
8565{

Callers 1

ZSTD_loadCEntropyFunction · 0.70

Calls 1

HUF_readStatsFunction · 0.70

Tested by

no test coverage detected