diff options
author | sceptillion <33798691+sceptillion@users.noreply.github.com> | 2017-12-12 00:17:17 -0800 |
---|---|---|
committer | sceptillion <33798691+sceptillion@users.noreply.github.com> | 2017-12-12 00:17:17 -0800 |
commit | d08ba1f0231ea44410601aebfd1b8e43a4ba8042 (patch) | |
tree | f6b2cb9dd0ad464feeb7e855a22e1011c9232e0d /src/file_system.c | |
parent | ae3751c57b030d847108d926f7bb6dbeb45307a8 (diff) |
decompile some of file_system
Diffstat (limited to 'src/file_system.c')
-rw-r--r-- | src/file_system.c | 145 |
1 files changed, 145 insertions, 0 deletions
diff --git a/src/file_system.c b/src/file_system.c new file mode 100644 index 0000000..adddb5e --- /dev/null +++ b/src/file_system.c @@ -0,0 +1,145 @@ +#include "global.h" + +struct File +{ + char *name; + u8 *data; +}; + +struct OpenedFile +{ + struct File *file; + u8 *data; +}; + +struct FileArchive +{ + char magic[8]; + s32 count; + struct File *entries; +}; + +extern struct OpenedFile gUnknown_202D2A8[]; + +extern u32 gUnknown_203B094; +extern u32 gUnknown_202D2A4; + +extern int sprintf(char *, const char *, ...); + +u8 *GetSiroPtr(struct OpenedFile *); + +void InitFileSystem(void) +{ + s32 i; + + for (i = 0; i < 64; i++) + { + gUnknown_202D2A8[i].file = NULL; + gUnknown_202D2A8[i].data = NULL; + } + + gUnknown_203B094 = 0; + gUnknown_202D2A4 = 1; +} + +u32 sub_800A8F8(u32 value) +{ + u32 oldValue = gUnknown_202D2A4; + gUnknown_202D2A4 = value; + return oldValue; +} + +struct OpenedFile *OpenFile(char *filename, struct FileArchive *arc) +{ + char buffer[0x12C]; + s32 left, right; + s32 cursor; + s32 i; + s32 magic = 0; + s32 magicFound; + struct File *entries; + struct File *file; + + magic = strcmp(arc->magic, "pksdir0") != 0; + + magicFound = 0; + + if (!(u8)magic) + magicFound = 1; + + if (!magicFound) + return NULL; + + entries = arc->entries; + left = 0; + right = arc->count - 1; + + while (left < right) + { + s32 mid = (left + right) / 2; + int result = strcmp(entries[mid].name, filename); + if (result == 0) + { + left = mid; + break; + } + else if (result < 0) + { + left = mid + 1; + } + else + { + right = mid; + } + } + + file = &entries[left]; + + if (strcmp(file->name, filename)) + { + sprintf(buffer, "not find file [%s]\n", filename); + return NULL; + } + + cursor = gUnknown_203B094; + + for (i = 0; i < 64; i++) + { + cursor++; + if (cursor > 63) + cursor = 0; + if (!gUnknown_202D2A8[cursor].file) + { + gUnknown_202D2A8[cursor].file = file; + gUnknown_202D2A8[cursor].data = NULL; + return &gUnknown_202D2A8[cursor]; + } + } + + return NULL; +} + +static u8 *_GetFileDataPtr(struct OpenedFile *openedFile) +{ + openedFile->data = openedFile->file->data; + return openedFile->data; +} + +u8 *GetFileDataPtr(struct OpenedFile *openedFile, int unused) +{ + _GetFileDataPtr(openedFile); + return GetSiroPtr(openedFile); +} + +struct OpenedFile *OpenFileAndGetFileDataPtr(char *filename, struct FileArchive *arc) +{ + struct OpenedFile *openedFile = OpenFile(filename, arc); + if (openedFile) + GetFileDataPtr(openedFile, 0); + return openedFile; +} + +struct OpenedFile *Call_OpenFileAndGetFileDataPtr(char *filename, struct FileArchive *arc) +{ + return OpenFileAndGetFileDataPtr(filename, arc); +} |