summaryrefslogtreecommitdiffstats
path: root/src/core/file_sys/vfs_concat.cpp
diff options
context:
space:
mode:
authorLioncash <mathew1800@gmail.com>2018-09-25 23:26:09 +0200
committerLioncash <mathew1800@gmail.com>2018-09-25 23:40:53 +0200
commit14e2df56101f7c7ab87939ea7a708ab4e6fb70c6 (patch)
tree767c4a2d64f4f0392646720eeb5ad98e9898469b /src/core/file_sys/vfs_concat.cpp
parentMerge pull request #1365 from DarkLordZach/lfs (diff)
downloadyuzu-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.cpp42
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