mirror of
https://git.suyu.dev/suyu/suyu.git
synced 2024-11-30 10:42:47 +01:00
registration: Various style and documentation improvements
Fix logic in RealVfsFilesystem Create methods Remove magic numbers Fix regex errors
This commit is contained in:
parent
6b76b77400
commit
35e4a47be0
3 changed files with 22 additions and 18 deletions
|
@ -103,7 +103,10 @@ bool CNMT::UnionRecords(const CNMT& other) {
|
||||||
std::vector<u8> CNMT::Serialize() const {
|
std::vector<u8> CNMT::Serialize() const {
|
||||||
const bool has_opt_header =
|
const bool has_opt_header =
|
||||||
header.type >= TitleType::Application && header.type <= TitleType::AOC;
|
header.type >= TitleType::Application && header.type <= TitleType::AOC;
|
||||||
std::vector<u8> out(sizeof(CNMTHeader) + (has_opt_header ? sizeof(OptionalHeader) : 0));
|
const auto dead_zone = header.table_offset + sizeof(CNMTHeader);
|
||||||
|
std::vector<u8> out(
|
||||||
|
std::max(sizeof(CNMTHeader) + (has_opt_header ? sizeof(OptionalHeader) : 0), dead_zone) +
|
||||||
|
content_records.size() * sizeof(ContentRecord) + meta_records.size() * sizeof(MetaRecord));
|
||||||
memcpy(out.data(), &header, sizeof(CNMTHeader));
|
memcpy(out.data(), &header, sizeof(CNMTHeader));
|
||||||
|
|
||||||
// Optional Header
|
// Optional Header
|
||||||
|
@ -113,17 +116,11 @@ std::vector<u8> CNMT::Serialize() const {
|
||||||
|
|
||||||
auto offset = header.table_offset;
|
auto offset = header.table_offset;
|
||||||
|
|
||||||
const auto dead_zone = offset + sizeof(CNMTHeader) - out.size();
|
|
||||||
if (dead_zone > 0)
|
|
||||||
out.resize(offset + sizeof(CNMTHeader));
|
|
||||||
|
|
||||||
out.resize(out.size() + content_records.size() * sizeof(ContentRecord));
|
|
||||||
for (const auto& rec : content_records) {
|
for (const auto& rec : content_records) {
|
||||||
memcpy(out.data() + offset + sizeof(CNMTHeader), &rec, sizeof(ContentRecord));
|
memcpy(out.data() + offset + sizeof(CNMTHeader), &rec, sizeof(ContentRecord));
|
||||||
offset += sizeof(ContentRecord);
|
offset += sizeof(ContentRecord);
|
||||||
}
|
}
|
||||||
|
|
||||||
out.resize(out.size() + content_records.size() * sizeof(MetaRecord));
|
|
||||||
for (const auto& rec : meta_records) {
|
for (const auto& rec : meta_records) {
|
||||||
memcpy(out.data() + offset + sizeof(CNMTHeader), &rec, sizeof(MetaRecord));
|
memcpy(out.data() + offset + sizeof(CNMTHeader), &rec, sizeof(MetaRecord));
|
||||||
offset += sizeof(MetaRecord);
|
offset += sizeof(MetaRecord);
|
||||||
|
|
|
@ -29,8 +29,8 @@ static bool FollowsTwoDigitDirFormat(std::string_view name) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool FollowsNcaIdFormat(std::string_view name) {
|
static bool FollowsNcaIdFormat(std::string_view name) {
|
||||||
static const std::regex nca_id_regex("[0-9A-F]{32}.nca", std::regex_constants::ECMAScript |
|
static const std::regex nca_id_regex("[0-9A-F]{32}\\.nca", std::regex_constants::ECMAScript |
|
||||||
std::regex_constants::icase);
|
std::regex_constants::icase);
|
||||||
return name.size() == 36 && std::regex_match(name.begin(), name.end(), nca_id_regex);
|
return name.size() == 36 && std::regex_match(name.begin(), name.end(), nca_id_regex);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -59,8 +59,10 @@ static std::string GetCNMTName(TitleType type, u64 title_id) {
|
||||||
|
|
||||||
auto index = static_cast<size_t>(type);
|
auto index = static_cast<size_t>(type);
|
||||||
// If the index is after the jump in TitleType, subtract it out.
|
// If the index is after the jump in TitleType, subtract it out.
|
||||||
if (index >= static_cast<size_t>(TitleType::Application))
|
if (index >= static_cast<size_t>(TitleType::Application)) {
|
||||||
index -= 0x7B;
|
index -= static_cast<size_t>(TitleType::Application) -
|
||||||
|
static_cast<size_t>(TitleType::FirmwarePackageB);
|
||||||
|
}
|
||||||
return fmt::format("{}_{:016x}.cnmt", TITLE_TYPE_NAMES[index], title_id);
|
return fmt::format("{}_{:016x}.cnmt", TITLE_TYPE_NAMES[index], title_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -96,7 +98,8 @@ VirtualFile RegisteredCache::OpenFileOrDirectoryConcat(const VirtualDir& dir,
|
||||||
file = files[0];
|
file = files[0];
|
||||||
} else {
|
} else {
|
||||||
std::vector<VirtualFile> concat;
|
std::vector<VirtualFile> concat;
|
||||||
for (u8 i = 0; i < 0x10; ++i) {
|
// Since the files are a two-digit hex number, max is FF.
|
||||||
|
for (size_t i = 0; i < 0x100; ++i) {
|
||||||
auto next = nca_dir->GetFile(fmt::format("{:02X}", i));
|
auto next = nca_dir->GetFile(fmt::format("{:02X}", i));
|
||||||
if (next != nullptr) {
|
if (next != nullptr) {
|
||||||
concat.push_back(std::move(next));
|
concat.push_back(std::move(next));
|
||||||
|
|
|
@ -84,9 +84,11 @@ VirtualFile RealVfsFilesystem::OpenFile(std::string_view path_, Mode perms) {
|
||||||
VirtualFile RealVfsFilesystem::CreateFile(std::string_view path_, Mode perms) {
|
VirtualFile RealVfsFilesystem::CreateFile(std::string_view path_, Mode perms) {
|
||||||
const auto path = FileUtil::SanitizePath(path_, FileUtil::DirectorySeparator::PlatformDefault);
|
const auto path = FileUtil::SanitizePath(path_, FileUtil::DirectorySeparator::PlatformDefault);
|
||||||
const auto path_fwd = FileUtil::SanitizePath(path, FileUtil::DirectorySeparator::ForwardSlash);
|
const auto path_fwd = FileUtil::SanitizePath(path, FileUtil::DirectorySeparator::ForwardSlash);
|
||||||
if (!FileUtil::Exists(path) && !FileUtil::CreateFullPath(path_fwd) &&
|
if (!FileUtil::Exists(path)) {
|
||||||
!FileUtil::CreateEmptyFile(path))
|
FileUtil::CreateFullPath(path_fwd);
|
||||||
return nullptr;
|
if (!FileUtil::CreateEmptyFile(path))
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
return OpenFile(path, perms);
|
return OpenFile(path, perms);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -143,9 +145,11 @@ VirtualDir RealVfsFilesystem::OpenDirectory(std::string_view path_, Mode perms)
|
||||||
VirtualDir RealVfsFilesystem::CreateDirectory(std::string_view path_, Mode perms) {
|
VirtualDir RealVfsFilesystem::CreateDirectory(std::string_view path_, Mode perms) {
|
||||||
const auto path = FileUtil::SanitizePath(path_, FileUtil::DirectorySeparator::PlatformDefault);
|
const auto path = FileUtil::SanitizePath(path_, FileUtil::DirectorySeparator::PlatformDefault);
|
||||||
const auto path_fwd = FileUtil::SanitizePath(path, FileUtil::DirectorySeparator::ForwardSlash);
|
const auto path_fwd = FileUtil::SanitizePath(path, FileUtil::DirectorySeparator::ForwardSlash);
|
||||||
if (!FileUtil::Exists(path) && !FileUtil::CreateFullPath(path_fwd) &&
|
if (!FileUtil::Exists(path)) {
|
||||||
!FileUtil::CreateEmptyFile(path))
|
FileUtil::CreateFullPath(path_fwd);
|
||||||
return nullptr;
|
if (!FileUtil::CreateDir(path))
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
// Cannot use make_shared as RealVfsDirectory constructor is private
|
// Cannot use make_shared as RealVfsDirectory constructor is private
|
||||||
return std::shared_ptr<RealVfsDirectory>(new RealVfsDirectory(*this, path, perms));
|
return std::shared_ptr<RealVfsDirectory>(new RealVfsDirectory(*this, path, perms));
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue