pmd-red/src/file_system.c
2024-11-16 19:41:48 +01:00

149 lines
2.9 KiB
C

#include "global.h"
#include "decompress.h"
#include "file_system.h"
EWRAM_DATA u32 gUnknown_202D2A4 = {0};
EWRAM_DATA OpenedFile gFileCache[64] = {0};
static EWRAM_DATA_2 u32 sFileCacheCursorPosition = {0};
#include "data/file_system.h"
// ???
extern s32 sprintf(char *, const char *, ...);
UNUSED static void FP48_16_Log(UnkFileStruct *r0, s32 r1)
{
s32 temp;
temp = r1;
if (temp < 1)
temp = 1;
if (temp > 299)
temp = 299;
r0->unk4 = gUnknown_80B96E4[temp];
r0->unk0 = 0;
}
void InitFileSystem(void)
{
s32 i;
for (i = 0; i < 64; i++) {
gFileCache[i].file = NULL;
gFileCache[i].data = NULL;
}
sFileCacheCursorPosition = 0;
gUnknown_202D2A4 = 1;
}
u32 sub_800A8F8(u32 value)
{
u32 oldValue = gUnknown_202D2A4;
gUnknown_202D2A4 = value;
return oldValue;
}
OpenedFile *OpenFile(const u8 *filename, const FileArchive *arc)
{
u8 buffer[300];
s32 left, right;
s32 cursor;
s32 i;
u32 magic = 0;
bool32 magicFound;
File *entries;
File *file;
magic = strcmp(arc->magic, gUnknown_80B9B94) != 0;
magicFound = 0;
if (!(bool8)magic)
magicFound = 1;
if (!magicFound)
return NULL;
entries = arc->entries;
left = 0;
right = arc->count - 1;
while (left < right) {
s32 mid = (left + right) / 2;
s32 result = strcmp(entries[mid].name, filename);
if (result == 0) {
left = mid;
break;
}
if (result < 0)
left = mid + 1;
else
right = mid;
}
file = &entries[left];
if (strcmp(file->name, filename)) {
sprintf(buffer, gUnknown_80B9B9C, filename);
return NULL;
}
cursor = sFileCacheCursorPosition;
for (i = 0; i < 64; i++) {
cursor++;
if (cursor > 63)
cursor = 0;
if (!gFileCache[cursor].file) {
gFileCache[cursor].file = file;
gFileCache[cursor].data = NULL;
return &gFileCache[cursor];
}
}
return NULL;
}
static u8 *_GetFileDataPtr(OpenedFile *openedFile)
{
openedFile->data = openedFile->file->data;
return openedFile->data;
}
u8 *GetFileDataPtr(OpenedFile *openedFile, s32 unused)
{
_GetFileDataPtr(openedFile);
return GetSiroPtr(openedFile);
}
OpenedFile *OpenFileAndGetFileDataPtr(const u8 *filename, const FileArchive *arc)
{
OpenedFile *openedFile = OpenFile(filename, arc);
if (openedFile)
GetFileDataPtr(openedFile, 0);
return openedFile;
}
OpenedFile *Call_OpenFileAndGetFileDataPtr(const u8 *filename, const FileArchive *arc)
{
return OpenFileAndGetFileDataPtr(filename, arc);
}
void CloseFile(OpenedFile *openedFile)
{
s32 i;
for (i = 0; i < 64; i++) {
if (&gFileCache[i] == openedFile) {
gFileCache[i].file = NULL;
gFileCache[i].data = NULL;
sFileCacheCursorPosition = i;
return;
}
}
}