summaryrefslogtreecommitdiffhomepage
path: root/ArchiveEx/Archive.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'ArchiveEx/Archive.cpp')
-rw-r--r--ArchiveEx/Archive.cpp41
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