diff options
author | Aki <please@ignore.pl> | 2022-08-17 21:58:34 +0200 |
---|---|---|
committer | Aki <please@ignore.pl> | 2022-08-17 21:58:34 +0200 |
commit | e7b0d4dc387f732e9f146fdaef5e531448510366 (patch) | |
tree | aca2fee8352501700dc606aa0e99483243159b59 /ArchiveEx/Archive.cpp | |
parent | 1f61374b7c680d7d70180369cff475bc70f55c3a (diff) | |
download | starshatter-e7b0d4dc387f732e9f146fdaef5e531448510366.zip starshatter-e7b0d4dc387f732e9f146fdaef5e531448510366.tar.gz starshatter-e7b0d4dc387f732e9f146fdaef5e531448510366.tar.bz2 |
Added function to create an empty archive
Diffstat (limited to 'ArchiveEx/Archive.cpp')
-rw-r--r-- | ArchiveEx/Archive.cpp | 29 |
1 files changed, 29 insertions, 0 deletions
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<Entry> 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<Bytef[]>(compressed_size); + int err = compress( + compressed.get(), + &compressed_size, + reinterpret_cast<Bytef*>(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<int>(compressed_size) != err) + throw "could not write directory (write)"; + archive.reset(); + return Archive(path); +} + + Archive::Archive(const char* p) : path {p}, header {}, |