diff options
author | Lioncash <mathew1800@gmail.com> | 2018-09-25 23:26:09 +0200 |
---|---|---|
committer | Lioncash <mathew1800@gmail.com> | 2018-09-25 23:40:53 +0200 |
commit | 14e2df56101f7c7ab87939ea7a708ab4e6fb70c6 (patch) | |
tree | 767c4a2d64f4f0392646720eeb5ad98e9898469b /src/core/file_sys/vfs_concat.cpp | |
parent | Merge pull request #1365 from DarkLordZach/lfs (diff) | |
download | yuzu-14e2df56101f7c7ab87939ea7a708ab4e6fb70c6.tar yuzu-14e2df56101f7c7ab87939ea7a708ab4e6fb70c6.tar.gz yuzu-14e2df56101f7c7ab87939ea7a708ab4e6fb70c6.tar.bz2 yuzu-14e2df56101f7c7ab87939ea7a708ab4e6fb70c6.tar.lz yuzu-14e2df56101f7c7ab87939ea7a708ab4e6fb70c6.tar.xz yuzu-14e2df56101f7c7ab87939ea7a708ab4e6fb70c6.tar.zst yuzu-14e2df56101f7c7ab87939ea7a708ab4e6fb70c6.zip |
Diffstat (limited to 'src/core/file_sys/vfs_concat.cpp')
-rw-r--r-- | src/core/file_sys/vfs_concat.cpp | 42 |
1 files changed, 33 insertions, 9 deletions
diff --git a/src/core/file_sys/vfs_concat.cpp b/src/core/file_sys/vfs_concat.cpp index d9f9911da..8a0df508e 100644 --- a/src/core/file_sys/vfs_concat.cpp +++ b/src/core/file_sys/vfs_concat.cpp @@ -7,6 +7,7 @@ #include "common/assert.h" #include "core/file_sys/vfs_concat.h" +#include "core/file_sys/vfs_static.h" namespace FileSys { @@ -22,15 +23,6 @@ static bool VerifyConcatenationMapContinuity(const std::map<u64, VirtualFile>& m return map.begin()->first == 0; } -VirtualFile ConcatenateFiles(std::vector<VirtualFile> files, std::string name) { - if (files.empty()) - return nullptr; - if (files.size() == 1) - return files[0]; - - return std::shared_ptr<VfsFile>(new ConcatenatedVfsFile(std::move(files), std::move(name))); -} - ConcatenatedVfsFile::ConcatenatedVfsFile(std::vector<VirtualFile> files_, std::string name) : name(std::move(name)) { std::size_t next_offset = 0; @@ -109,4 +101,36 @@ bool ConcatenatedVfsFile::Rename(std::string_view name) { return false; } +VirtualFile ConcatenateFiles(std::vector<VirtualFile> files, std::string name) { + if (files.empty()) + return nullptr; + if (files.size() == 1) + return files[0]; + + return std::shared_ptr<VfsFile>(new ConcatenatedVfsFile(std::move(files), std::move(name))); +} + +VirtualFile ConcatenateFiles(u8 filler_byte, std::map<u64, VirtualFile> files, std::string name) { + if (files.empty()) + return nullptr; + if (files.size() == 1) + return files.begin()->second; + + const auto last_valid = --files.end(); + for (auto iter = files.begin(); iter != last_valid;) { + const auto old = iter++; + if (old->first + old->second->GetSize() != iter->first) { + files.emplace(old->first + old->second->GetSize(), + std::make_shared<StaticVfsFile>(filler_byte, iter->first - old->first - + old->second->GetSize())); + } + } + + // Ensure the map starts at offset 0 (start of file), otherwise pad to fill. + if (files.begin()->first != 0) + files.emplace(0, std::make_shared<StaticVfsFile>(filler_byte, files.begin()->first)); + + return std::shared_ptr<VfsFile>(new ConcatenatedVfsFile(std::move(files), std::move(name))); +} + } // namespace FileSys |