mirror of
https://github.com/d0k3/GodMode9.git
synced 2025-06-26 13:42:47 +00:00
Speed up RomFS browsing via lv3 hashes
This commit is contained in:
parent
dc3ea378ce
commit
1b4481daa5
@ -550,6 +550,28 @@ int ReadVGameFile(const VirtualFile* vfile, u8* buffer, u32 offset, u32 count) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool FindVirtualFileInLv3Dir(VirtualFile* vfile, const VirtualDir* vdir, const char* name) {
|
||||||
|
vfile->name[0] = '\0';
|
||||||
|
vfile->flags = vdir->flags & ~VFLAG_DIR;
|
||||||
|
|
||||||
|
RomFsLv3FileMeta* lv3file = GetLv3FileMeta(name, vdir->offset, &lv3idx);
|
||||||
|
if (lv3file) {
|
||||||
|
vfile->offset = ((u8*) lv3file) - ((u8*) lv3idx.filemeta);
|
||||||
|
vfile->size = lv3file->size_data;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
RomFsLv3DirMeta* lv3dir = GetLv3DirMeta(name, vdir->offset, &lv3idx);
|
||||||
|
if (lv3dir) {
|
||||||
|
vfile->offset = ((u8*) lv3dir) - ((u8*) lv3idx.dirmeta);
|
||||||
|
vfile->size = 0;
|
||||||
|
vfile->flags |= VFLAG_DIR;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
bool GetVGameLv3Filename(char* name, const VirtualFile* vfile, u32 n_chars) {
|
bool GetVGameLv3Filename(char* name, const VirtualFile* vfile, u32 n_chars) {
|
||||||
if (!(vfile->flags & VFLAG_LV3))
|
if (!(vfile->flags & VFLAG_LV3))
|
||||||
return false;
|
return false;
|
||||||
|
@ -88,12 +88,17 @@ bool GetVirtualFile(VirtualFile* vfile, const char* path) {
|
|||||||
VirtualDir vdir;
|
VirtualDir vdir;
|
||||||
if (!OpenVirtualRoot(&vdir, virtual_src)) return false;
|
if (!OpenVirtualRoot(&vdir, virtual_src)) return false;
|
||||||
for (name = strtok(lpath + 3, "/"); name && vdir.virtual_src; name = strtok(NULL, "/")) {
|
for (name = strtok(lpath + 3, "/"); name && vdir.virtual_src; name = strtok(NULL, "/")) {
|
||||||
|
if (!(vdir.flags & VFLAG_LV3)) { // standard method
|
||||||
while (true) {
|
while (true) {
|
||||||
if (!ReadVirtualDir(vfile, &vdir)) return false;
|
if (!ReadVirtualDir(vfile, &vdir)) return false;
|
||||||
if ((!(vfile->flags & VFLAG_LV3) && (strncasecmp(name, vfile->name, 32) == 0)) ||
|
if ((!(vfile->flags & VFLAG_LV3) && (strncasecmp(name, vfile->name, 32) == 0)) ||
|
||||||
((vfile->flags & VFLAG_LV3) && MatchVGameLv3Filename(name, vfile, 256)))
|
((vfile->flags & VFLAG_LV3) && MatchVGameLv3Filename(name, vfile, 256)))
|
||||||
break; // entry found
|
break; // entry found
|
||||||
}
|
}
|
||||||
|
} else { // use lv3 hashes for quicker search
|
||||||
|
if (!FindVirtualFileInLv3Dir(vfile, &vdir, name))
|
||||||
|
return false;
|
||||||
|
}
|
||||||
if (!OpenVirtualDir(&vdir, vfile))
|
if (!OpenVirtualDir(&vdir, vfile))
|
||||||
vdir.virtual_src = 0;
|
vdir.virtual_src = 0;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user