From f5851278765e468f7fe04f943b8d69021e22e004 Mon Sep 17 00:00:00 2001 From: Aki Date: Mon, 8 Aug 2022 23:33:51 +0200 Subject: Added a functionality that enables extracting files by their path --- ArchiveEx/Archive.cpp | 41 ++++++++++++++++++++++++++++++++++++++++- ArchiveEx/Archive.h | 2 ++ 2 files changed, 42 insertions(+), 1 deletion(-) diff --git a/ArchiveEx/Archive.cpp b/ArchiveEx/Archive.cpp index 3eea0fe..2e3aa52 100644 --- a/ArchiveEx/Archive.cpp +++ b/ArchiveEx/Archive.cpp @@ -2,6 +2,7 @@ #include #include +#include #include #include @@ -18,7 +19,8 @@ using UniqueFileHandle = std::unique_ptr; static constexpr std::size_t DIRECTORY_MARGIN {64}; -static std::size_t BytesToBlocks(std::size_t bytes); +static inline std::size_t BytesToBlocks(std::size_t bytes); +static inline std::size_t ConvertPathSeparator(const char* src, char* dest); Archive::Archive(const char* p) : @@ -85,6 +87,29 @@ Archive::Expand(const int index, std::uint8_t*& buffer, const bool null_terminat } +int +Archive::Expand(const char* filepath, std::uint8_t*& buffer, const bool null_terminated) const +{ + const int index = Find(filepath); + if (-1 == index) + return -1; + return Expand(index, buffer, null_terminated); +} + + +int +Archive::Find(const char* filepath) const +{ + std::vector path(std::strlen(filepath) + 1); + ConvertPathSeparator(filepath, path.data()); + for (std::size_t i = 0; i < entries.size(); ++i) { + if (0 == std::strcmp(entries[i].name, path.data())) + return i; + } + return -1; +} + + void Archive::PrintNamesOfEntries() const { @@ -110,4 +135,18 @@ BytesToBlocks(const std::size_t bytes) } +std::size_t +ConvertPathSeparator(const char* src, char* dest) +{ + std::size_t i; + for (i = 0; 0 != src[i]; ++i) { + if ('\\' == src[i]) + dest[i] = '/'; + else + dest[i] = src[i]; + } + return i; +} + + } // namespace Archive diff --git a/ArchiveEx/Archive.h b/ArchiveEx/Archive.h index 6870194..0f1be0c 100644 --- a/ArchiveEx/Archive.h +++ b/ArchiveEx/Archive.h @@ -40,6 +40,8 @@ class Archive public: explicit Archive(const char* path); int Expand(int index, std::uint8_t*& buffer, bool null_terminated=false) const; + int Expand(const char* filepath, std::uint8_t*& buffer, bool null_terminated=false) const; + int Find(const char* filepath) const; void PrintNamesOfEntries() const; std::size_t DirectoryBlocks() const; private: -- cgit v1.1