MCPcopy Create free account
hub / github.com/diasurgical/devilution / TranslateHetTable

Function TranslateHetTable

3rdParty/StormLib/src/SBaseFileTable.cpp:1307–1353  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

1305}
1306
1307static TMPQHetTable * TranslateHetTable(TMPQHetHeader * pHetHeader)
1308{
1309 TMPQHetTable * pHetTable = NULL;
1310 LPBYTE pbSrcData = (LPBYTE)(pHetHeader + 1);
1311
1312 // Sanity check
1313 assert(pHetHeader->ExtHdr.dwSignature == HET_TABLE_SIGNATURE);
1314 assert(pHetHeader->ExtHdr.dwVersion == 1);
1315
1316 // Verify size of the HET table
1317 if(pHetHeader->ExtHdr.dwDataSize >= (sizeof(TMPQHetHeader) - sizeof(TMPQExtHeader)))
1318 {
1319 // Verify the size of the table in the header
1320 if(pHetHeader->dwTableSize == pHetHeader->ExtHdr.dwDataSize)
1321 {
1322 // The size of the HET table must be sum of header, hash and index table size
1323 assert((sizeof(TMPQHetHeader) - sizeof(TMPQExtHeader) + pHetHeader->dwTotalCount + pHetHeader->dwIndexTableSize) == pHetHeader->dwTableSize);
1324
1325 // So far, all MPQs with HET Table have had total number of entries equal to 4/3 of file count
1326 // Exception: "2010 - Starcraft II\!maps\Tya's Zerg Defense (unprotected).SC2Map"
1327// assert(((pHetHeader->dwEntryCount * 4) / 3) == pHetHeader->dwTotalCount);
1328
1329 // The size of one index is predictable as well
1330 assert(GetNecessaryBitCount(pHetHeader->dwEntryCount) == pHetHeader->dwIndexSizeTotal);
1331
1332 // The size of index table (in entries) is expected
1333 // to be the same like the hash table size (in bytes)
1334 assert(((pHetHeader->dwTotalCount * pHetHeader->dwIndexSizeTotal) + 7) / 8 == pHetHeader->dwIndexTableSize);
1335
1336 // Create translated table
1337 pHetTable = CreateHetTable(pHetHeader->dwEntryCount, pHetHeader->dwTotalCount, pHetHeader->dwNameHashBitSize, pbSrcData);
1338 if(pHetTable != NULL)
1339 {
1340 // Now the sizes in the hash table should be already set
1341 assert(pHetTable->dwEntryCount == pHetHeader->dwEntryCount);
1342 assert(pHetTable->dwTotalCount == pHetHeader->dwTotalCount);
1343 assert(pHetTable->dwIndexSizeTotal == pHetHeader->dwIndexSizeTotal);
1344
1345 // Copy the missing variables
1346 pHetTable->dwIndexSizeExtra = pHetHeader->dwIndexSizeExtra;
1347 pHetTable->dwIndexSize = pHetHeader->dwIndexSize;
1348 }
1349 }
1350 }
1351
1352 return pHetTable;
1353}
1354
1355static TMPQExtHeader * TranslateHetTable(TMPQHetTable * pHetTable, ULONGLONG * pcbHetTable)
1356{

Callers 2

LoadHetTableFunction · 0.85
SaveMPQTablesFunction · 0.85

Calls 3

GetNecessaryBitCountFunction · 0.85
CreateHetTableFunction · 0.85
CreateHetHeaderFunction · 0.85

Tested by

no test coverage detected