| 8512 | |
| 8513 | |
| 8514 | size_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 | |
| 8564 | U32 HUF_getNbBits(const void* symbolTable, U32 symbolValue) |
| 8565 | { |
no test coverage detected