Core: Fix leaks and clean up mDirectorySet

This commit is contained in:
Vicki Pfau 2022-06-30 04:41:50 -07:00
parent 11589d874f
commit 96c137c1a2
1 changed files with 52 additions and 107 deletions

View File

@ -10,92 +10,53 @@
#if !defined(MINIMAL_CORE) || MINIMAL_CORE < 2 #if !defined(MINIMAL_CORE) || MINIMAL_CORE < 2
void mDirectorySetInit(struct mDirectorySet* dirs) { void mDirectorySetInit(struct mDirectorySet* dirs) {
dirs->base = 0; dirs->base = NULL;
dirs->archive = 0; dirs->archive = NULL;
dirs->save = 0; dirs->save = NULL;
dirs->patch = 0; dirs->patch = NULL;
dirs->state = 0; dirs->state = NULL;
dirs->screenshot = 0; dirs->screenshot = NULL;
dirs->cheats = 0; dirs->cheats = NULL;
}
static void mDirectorySetDetachDir(struct mDirectorySet* dirs, struct VDir* dir) {
if (!dir) {
return;
}
if (dirs->base == dir) {
dirs->base = NULL;
}
if (dirs->archive == dir) {
dirs->archive = NULL;
}
if (dirs->save == dir) {
dirs->save = NULL;
}
if (dirs->patch == dir) {
dirs->patch = NULL;
}
if (dirs->state == dir) {
dirs->state = NULL;
}
if (dirs->screenshot == dir) {
dirs->screenshot = NULL;
}
if (dirs->cheats == dir) {
dirs->cheats = NULL;
}
dir->close(dir);
} }
void mDirectorySetDeinit(struct mDirectorySet* dirs) { void mDirectorySetDeinit(struct mDirectorySet* dirs) {
mDirectorySetDetachBase(dirs); mDirectorySetDetachBase(dirs);
mDirectorySetDetachDir(dirs, dirs->archive);
if (dirs->archive) { mDirectorySetDetachDir(dirs, dirs->save);
if (dirs->archive == dirs->save) { mDirectorySetDetachDir(dirs, dirs->patch);
dirs->save = NULL; mDirectorySetDetachDir(dirs, dirs->state);
} mDirectorySetDetachDir(dirs, dirs->screenshot);
if (dirs->archive == dirs->patch) { mDirectorySetDetachDir(dirs, dirs->cheats);
dirs->patch = NULL;
}
if (dirs->archive == dirs->state) {
dirs->state = NULL;
}
if (dirs->archive == dirs->screenshot) {
dirs->screenshot = NULL;
}
if (dirs->archive == dirs->cheats) {
dirs->cheats = NULL;
}
dirs->archive->close(dirs->archive);
dirs->archive = NULL;
}
if (dirs->save) {
if (dirs->save == dirs->patch) {
dirs->patch = NULL;
}
if (dirs->save == dirs->state) {
dirs->state = NULL;
}
if (dirs->save == dirs->screenshot) {
dirs->screenshot = NULL;
}
if (dirs->save == dirs->cheats) {
dirs->cheats = NULL;
}
dirs->save->close(dirs->save);
dirs->save = NULL;
}
if (dirs->patch) {
if (dirs->patch == dirs->state) {
dirs->state = NULL;
}
if (dirs->patch == dirs->screenshot) {
dirs->screenshot = NULL;
}
if (dirs->patch == dirs->cheats) {
dirs->cheats = NULL;
}
dirs->patch->close(dirs->patch);
dirs->patch = NULL;
}
if (dirs->state) {
if (dirs->state == dirs->screenshot) {
dirs->state = NULL;
}
if (dirs->state == dirs->cheats) {
dirs->cheats = NULL;
}
dirs->state->close(dirs->state);
dirs->state = NULL;
}
if (dirs->screenshot) {
if (dirs->screenshot == dirs->cheats) {
dirs->cheats = NULL;
}
dirs->screenshot->close(dirs->screenshot);
dirs->screenshot = NULL;
}
if (dirs->cheats) {
dirs->cheats->close(dirs->cheats);
dirs->cheats = NULL;
}
} }
void mDirectorySetAttachBase(struct mDirectorySet* dirs, struct VDir* base) { void mDirectorySetAttachBase(struct mDirectorySet* dirs, struct VDir* base) {
@ -118,36 +79,20 @@ void mDirectorySetAttachBase(struct mDirectorySet* dirs, struct VDir* base) {
} }
void mDirectorySetDetachBase(struct mDirectorySet* dirs) { void mDirectorySetDetachBase(struct mDirectorySet* dirs) {
if (dirs->save == dirs->base) { mDirectorySetDetachDir(dirs, dirs->archive);
dirs->save = NULL; mDirectorySetDetachDir(dirs, dirs->base);
}
if (dirs->patch == dirs->base) {
dirs->patch = NULL;
}
if (dirs->state == dirs->base) {
dirs->state = NULL;
}
if (dirs->screenshot == dirs->base) {
dirs->screenshot = NULL;
}
if (dirs->cheats == dirs->base) {
dirs->cheats = NULL;
}
if (dirs->base) {
dirs->base->close(dirs->base);
dirs->base = NULL;
}
} }
struct VFile* mDirectorySetOpenPath(struct mDirectorySet* dirs, const char* path, bool (*filter)(struct VFile*)) { struct VFile* mDirectorySetOpenPath(struct mDirectorySet* dirs, const char* path, bool (*filter)(struct VFile*)) {
dirs->archive = VDirOpenArchive(path); struct VDir* archive = VDirOpenArchive(path);
struct VFile* file; struct VFile* file;
if (dirs->archive) { if (archive) {
file = VDirFindFirst(dirs->archive, filter); file = VDirFindFirst(archive, filter);
if (!file) { if (!file) {
dirs->archive->close(dirs->archive); archive->close(archive);
dirs->archive = 0; } else {
mDirectorySetDetachDir(dirs, dirs->archive);
dirs->archive = archive;
} }
} else { } else {
file = VFileOpen(path, O_RDONLY); file = VFileOpen(path, O_RDONLY);