|
|
|
@ -124,7 +124,7 @@ static u64 romfs_get_hash_table_count(u64 num_entries) { |
|
|
|
return count; |
|
|
|
} |
|
|
|
|
|
|
|
void RomFSBuildContext::VisitDirectory(VirtualDir root_romfs, |
|
|
|
void RomFSBuildContext::VisitDirectory(VirtualDir root_romfs, VirtualDir ext, |
|
|
|
std::shared_ptr<RomFSBuildDirectoryContext> parent) { |
|
|
|
std::vector<std::shared_ptr<RomFSBuildDirectoryContext>> child_dirs; |
|
|
|
|
|
|
|
@ -139,15 +139,15 @@ void RomFSBuildContext::VisitDirectory(VirtualDir root_romfs, |
|
|
|
|
|
|
|
for (const auto& kv : entries) { |
|
|
|
if (kv.second == VfsEntryType::Directory) { |
|
|
|
if (dir->GetSubdirectory(kv.first + ".stub") != nullptr) |
|
|
|
continue; |
|
|
|
|
|
|
|
const auto child = std::make_shared<RomFSBuildDirectoryContext>(); |
|
|
|
// Set child's path.
|
|
|
|
child->cur_path_ofs = parent->path_len + 1; |
|
|
|
child->path_len = child->cur_path_ofs + static_cast<u32>(kv.first.size()); |
|
|
|
child->path = parent->path + "/" + kv.first; |
|
|
|
|
|
|
|
if (ext != nullptr && ext->GetFileRelative(child->path + ".stub") != nullptr) |
|
|
|
continue; |
|
|
|
|
|
|
|
// Sanity check on path_len
|
|
|
|
ASSERT(child->path_len < FS_MAX_PATH); |
|
|
|
|
|
|
|
@ -155,25 +155,28 @@ void RomFSBuildContext::VisitDirectory(VirtualDir root_romfs, |
|
|
|
child_dirs.push_back(child); |
|
|
|
} |
|
|
|
} else { |
|
|
|
if (dir->GetFile(kv.first + ".stub") != nullptr) |
|
|
|
continue; |
|
|
|
|
|
|
|
const auto child = std::make_shared<RomFSBuildFileContext>(); |
|
|
|
// Set child's path.
|
|
|
|
child->cur_path_ofs = parent->path_len + 1; |
|
|
|
child->path_len = child->cur_path_ofs + static_cast<u32>(kv.first.size()); |
|
|
|
child->path = parent->path + "/" + kv.first; |
|
|
|
|
|
|
|
if (ext != nullptr && ext->GetFileRelative(child->path + ".stub") != nullptr) |
|
|
|
continue; |
|
|
|
|
|
|
|
// Sanity check on path_len
|
|
|
|
ASSERT(child->path_len < FS_MAX_PATH); |
|
|
|
|
|
|
|
child->source = root_romfs->GetFileRelative(child->path); |
|
|
|
|
|
|
|
if (dir->GetFile(kv.first + ".ips") != nullptr) { |
|
|
|
const auto ips = dir->GetFile(kv.first + ".ips"); |
|
|
|
auto patched = PatchIPS(child->source, ips); |
|
|
|
if (patched != nullptr) |
|
|
|
child->source = std::move(patched); |
|
|
|
if (ext != nullptr) { |
|
|
|
const auto ips = ext->GetFileRelative(child->path + ".ips"); |
|
|
|
|
|
|
|
if (ips != nullptr) { |
|
|
|
auto patched = PatchIPS(child->source, ips); |
|
|
|
if (patched != nullptr) |
|
|
|
child->source = std::move(patched); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
child->size = child->source->GetSize(); |
|
|
|
@ -183,7 +186,7 @@ void RomFSBuildContext::VisitDirectory(VirtualDir root_romfs, |
|
|
|
} |
|
|
|
|
|
|
|
for (auto& child : child_dirs) { |
|
|
|
this->VisitDirectory(root_romfs, child); |
|
|
|
this->VisitDirectory(root_romfs, ext, child); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
@ -222,14 +225,15 @@ bool RomFSBuildContext::AddFile(std::shared_ptr<RomFSBuildDirectoryContext> pare |
|
|
|
return true; |
|
|
|
} |
|
|
|
|
|
|
|
RomFSBuildContext::RomFSBuildContext(VirtualDir base_) : base(std::move(base_)) { |
|
|
|
RomFSBuildContext::RomFSBuildContext(VirtualDir base_, VirtualDir ext_) |
|
|
|
: base(std::move(base_)), ext(std::move(ext_)) { |
|
|
|
root = std::make_shared<RomFSBuildDirectoryContext>(); |
|
|
|
root->path = "\0"; |
|
|
|
directories.emplace(root->path, root); |
|
|
|
num_dirs = 1; |
|
|
|
dir_table_size = 0x18; |
|
|
|
|
|
|
|
VisitDirectory(base, root); |
|
|
|
VisitDirectory(base, ext, root); |
|
|
|
} |
|
|
|
|
|
|
|
RomFSBuildContext::~RomFSBuildContext() = default; |
|
|
|
|