summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorAki <please@ignore.pl>2022-09-17 13:49:30 +0200
committerAki <please@ignore.pl>2022-09-17 13:49:30 +0200
commit0fc03adc2c209f59f4bead0b2269fc16c00007c2 (patch)
treeb13c0f707fed7329b21d22a3422ff3cd2ddc05fb
parenta382cf3647b8fa8e7bae9d73f0fa9a6d4f680522 (diff)
downloadstarshatter-0fc03adc2c209f59f4bead0b2269fc16c00007c2.zip
starshatter-0fc03adc2c209f59f4bead0b2269fc16c00007c2.tar.gz
starshatter-0fc03adc2c209f59f4bead0b2269fc16c00007c2.tar.bz2
Path normalization will now remove cwd from relative path
-rw-r--r--ArchiveEx/Archive.cpp10
1 files changed, 6 insertions, 4 deletions
diff --git a/ArchiveEx/Archive.cpp b/ArchiveEx/Archive.cpp
index ad29c92..67cdb16 100644
--- a/ArchiveEx/Archive.cpp
+++ b/ArchiveEx/Archive.cpp
@@ -35,7 +35,7 @@ using UniqueFileHandle = std::unique_ptr<std::FILE, decltype(&std::fclose)>;
static inline std::size_t BytesToBlocks(std::size_t bytes);
-static inline std::size_t ConvertPathSeparator(const char* src, char* dest);
+static inline std::size_t NormalizePath(const char* src, char* dest);
static constexpr std::uint32_t VERSION {0x0010};
@@ -129,7 +129,7 @@ int
Archive::Find(const char* filepath) const
{
auto path = std::make_unique<char[]>(std::strlen(filepath) + 1);
- ConvertPathSeparator(filepath, path.get());
+ NormalizePath(filepath, path.get());
for (std::size_t i = 0; i < entries.size(); ++i) {
#ifdef _WIN32
if (0 == _stricmp(entries[i].name, path.get()))
@@ -187,7 +187,7 @@ Archive::Insert(const char* filepath)
for (std::size_t i = destination_block; i < destination_block + total_blocks; ++i)
blocks[i] = index;
auto normalized_path = std::make_unique<char[]>(std::strlen(filepath) + 1);
- ConvertPathSeparator(filepath, normalized_path.get());
+ NormalizePath(filepath, normalized_path.get());
std::strcpy(entries[index].name, normalized_path.get());
entries[index].original_size = uncompressed_size;
entries[index].compressed_size = compressed_size;
@@ -356,8 +356,10 @@ BytesToBlocks(const std::size_t bytes)
std::size_t
-ConvertPathSeparator(const char* src, char* dest)
+NormalizePath(const char* src, char* dest)
{
+ if ('.' == src[0] && ('/' == src[1] || '\\' == src[1]))
+ return NormalizePath(&src[2], dest);
std::size_t i;
for (i = 0; 0 != src[i]; ++i) {
if ('\\' == src[i])