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

Function LoadExtTable

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

Source from the content-addressed store, hash-verified

951// General EXT table functions
952
953TMPQExtHeader * LoadExtTable(
954 TMPQArchive * ha,
955 ULONGLONG ByteOffset,
956 size_t Size,
957 DWORD dwSignature,
958 DWORD dwKey)
959{
960 TMPQExtHeader * pCompressed = NULL; // Compressed table
961 TMPQExtHeader * pExtTable = NULL; // Uncompressed table
962
963 // Do nothing if the size is zero
964 if(ByteOffset != 0 && Size != 0)
965 {
966 // Allocate size for the compressed table
967 pExtTable = (TMPQExtHeader *)STORM_ALLOC(BYTE, Size);
968 if(pExtTable != NULL)
969 {
970 // Load the table from the MPQ
971 ByteOffset += ha->MpqPos;
972 if(!FileStream_Read(ha->pStream, &ByteOffset, pExtTable, (DWORD)Size))
973 {
974 STORM_FREE(pExtTable);
975 return NULL;
976 }
977
978 // Swap the ext table header
979 BSWAP_ARRAY32_UNSIGNED(pExtTable, sizeof(TMPQExtHeader));
980 if(pExtTable->dwSignature != dwSignature)
981 {
982 STORM_FREE(pExtTable);
983 return NULL;
984 }
985
986 // Decrypt the block
987 BSWAP_ARRAY32_UNSIGNED(pExtTable + 1, pExtTable->dwDataSize);
988 DecryptMpqBlock(pExtTable + 1, (DWORD)(Size - sizeof(TMPQExtHeader)), dwKey);
989 BSWAP_ARRAY32_UNSIGNED(pExtTable + 1, pExtTable->dwDataSize);
990
991 // If the table is compressed, decompress it
992 if((pExtTable->dwDataSize + sizeof(TMPQExtHeader)) > Size)
993 {
994 pCompressed = pExtTable;
995 pExtTable = (TMPQExtHeader *)STORM_ALLOC(BYTE, sizeof(TMPQExtHeader) + pCompressed->dwDataSize);
996 if(pExtTable != NULL)
997 {
998 int cbOutBuffer = (int)pCompressed->dwDataSize;
999 int cbInBuffer = (int)Size;
1000
1001 // Decompress the extended table
1002 pExtTable->dwSignature = pCompressed->dwSignature;
1003 pExtTable->dwVersion = pCompressed->dwVersion;
1004 pExtTable->dwDataSize = pCompressed->dwDataSize;
1005 if(!SCompDecompress2(pExtTable + 1, &cbOutBuffer, pCompressed + 1, cbInBuffer))
1006 {
1007 STORM_FREE(pExtTable);
1008 pExtTable = NULL;
1009 }
1010 }

Callers 3

LoadHetTableFunction · 0.85
LoadBetTableFunction · 0.85
SFileGetFileInfoFunction · 0.85

Calls 3

FileStream_ReadFunction · 0.85
DecryptMpqBlockFunction · 0.85
SCompDecompress2Function · 0.85

Tested by

no test coverage detected