From e7b0d4dc387f732e9f146fdaef5e531448510366 Mon Sep 17 00:00:00 2001 From: Aki Date: Wed, 17 Aug 2022 21:58:34 +0200 Subject: Added function to create an empty archive --- ArchiveEx/Archive.cpp | 29 +++++++++++++++++++++++++++++ ArchiveEx/Archive.h | 3 +++ 2 files changed, 32 insertions(+) diff --git a/ArchiveEx/Archive.cpp b/ArchiveEx/Archive.cpp index 4275502..e5f2c8f 100644 --- a/ArchiveEx/Archive.cpp +++ b/ArchiveEx/Archive.cpp @@ -26,6 +26,35 @@ static constexpr int UNUSED_BLOCK {-1}; static constexpr int DIRECTORY_BLOCK {-2}; +Archive +CreateEmpty(const char* path) +{ + Header header = {VERSION, 0, {0, 0, 0}}; + std::vector entries; + entries.reserve(DIRECTORY_MARGIN); + const std::size_t uncompressed_size = DIRECTORY_MARGIN * sizeof(Entry); + uLongf compressed_size = uncompressed_size * 1.1 + 12; + auto compressed = std::make_unique(compressed_size); + int err = compress( + compressed.get(), + &compressed_size, + reinterpret_cast(entries.data()), + uncompressed_size); + if (Z_OK != err) + throw "could not compress directory metadata"; + header.directory.compressed_size = compressed_size; + UniqueFileHandle archive {std::fopen(path, "wb"), &std::fclose}; + err = std::fwrite(&header, sizeof(Header), 1, archive.get()); + if (1 != err) + throw "could not write header (write)"; + err = std::fwrite(compressed.get(), 1, compressed_size, archive.get()); + if (static_cast(compressed_size) != err) + throw "could not write directory (write)"; + archive.reset(); + return Archive(path); +} + + Archive::Archive(const char* p) : path {p}, header {}, diff --git a/ArchiveEx/Archive.h b/ArchiveEx/Archive.h index ed042f6..64b73d5 100644 --- a/ArchiveEx/Archive.h +++ b/ArchiveEx/Archive.h @@ -55,4 +55,7 @@ private: }; +Archive CreateEmpty(const char* path); + + } // namespace Archive -- cgit v1.1