diff options
Diffstat (limited to 'ArchiveEx/Archive.cpp')
-rw-r--r-- | ArchiveEx/Archive.cpp | 41 |
1 files changed, 40 insertions, 1 deletions
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 <cstdint> #include <cstdio> +#include <cstring> #include <memory> #include <vector> @@ -18,7 +19,8 @@ using UniqueFileHandle = std::unique_ptr<std::FILE, decltype(&std::fclose)>; 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<char> 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 |