thorium/pak_src/pak_file.c
2022-02-11 12:39:10 -08:00

94 lines
3.3 KiB
C

#include "pak_file.h"
PakFile pakPackFiles(MyPakHeader *myHeader, PakFile *pakResFile,
PakAlias *pakAlias) {
uint8_t *buffer = NULL;
uint32_t size = myHeader->size;
uint32_t entrySize = (myHeader->resource_count + 1) * PAK_ENTRY_SIZE;
uint32_t aliasSize = myHeader->alias_count * PAK_ALIAS_SIZE;
size += entrySize + aliasSize;
for (uint32_t i = 0; i < myHeader->resource_count; i++) {
size += (pakResFile + i)->size;
}
buffer = calloc(size, sizeof(uint8_t));
if (buffer == NULL)
return NULL_File;
uint32_t offset = pakWriteHeader(myHeader, buffer);
if (offset == 0) {
free(buffer);
return NULL_File;
}
PakEntry *enrtyPtr = (PakEntry *)(buffer + offset);
uint8_t *filePtr = buffer + offset + entrySize + aliasSize;
for (uint32_t i = 0; i < myHeader->resource_count; i++) {
memcpy(filePtr, pakResFile->buffer, pakResFile->size);
enrtyPtr->resource_id = pakResFile->id;
enrtyPtr->offset = filePtr - buffer;
filePtr += pakResFile->size;
enrtyPtr++;
pakResFile++;
}
enrtyPtr->resource_id = 0;
enrtyPtr->offset = (pakResFile - 1)->size + (enrtyPtr - 1)->offset;
void *aliasPtr = (void *)(enrtyPtr + 1);
memcpy(aliasPtr, pakAlias, aliasSize);
PakFile pakFile;
pakFile.buffer = buffer;
pakFile.size = size;
return pakFile;
}
PakFile pakGetFile(uint8_t *pakBuffer, uint16_t id) {
PakFile pakFile = NULL_File;
MyPakHeader myHeader;
if (!pakParseHeader(pakBuffer, &myHeader)) {
return NULL_File;
}
PakEntry *entryPtr = (PakEntry *)(pakBuffer + myHeader.size);
if (myHeader.version == 5) {
PakAlias *aliasPtr =
(PakAlias *)(pakBuffer + myHeader.size +
(myHeader.resource_count + 1) * PAK_ENTRY_SIZE);
for (uint16_t i = 0; i < myHeader.alias_count; i++) {
if (aliasPtr->resource_id == id) {
entryPtr += aliasPtr->entry_index;
pakFile.buffer = pakBuffer + entryPtr->offset;
pakFile.size = (entryPtr + 1)->offset - entryPtr->offset;
return pakFile;
}
}
}
for (uint32_t i = 0; i < myHeader.resource_count; i++) {
if (entryPtr->resource_id == id) {
pakFile.buffer = pakBuffer + entryPtr->offset;
pakFile.size = (entryPtr + 1)->offset - entryPtr->offset;
return pakFile;
}
entryPtr++;
}
return NULL_File;
}
PakFile *pakGetFiles(uint8_t *buffer) {
PakFile *pakResFile = NULL;
MyPakHeader myHeader;
if (!pakParseHeader(buffer, &myHeader)) {
return NULL;
}
pakResFile = (PakFile *)calloc(myHeader.resource_count, sizeof(PakFile));
PakFile *returnValue = pakResFile;
if (pakResFile == NULL) {
return NULL;
}
PakEntry *pakEntryPtr = (PakEntry *)(buffer + myHeader.size);
for (uint32_t i = 0; i < myHeader.resource_count; i++) {
uint32_t offset = pakEntryPtr->offset;
pakResFile->id = pakEntryPtr->resource_id;
pakResFile->buffer = buffer + offset;
pakEntryPtr++;
pakResFile->size = pakEntryPtr->offset - offset;
pakResFile++;
}
return returnValue;
}