diff --git a/src/loader/binary_loader.cpp b/src/loader/binary_loader.cpp index 5e89548..18645c8 100644 --- a/src/loader/binary_loader.cpp +++ b/src/loader/binary_loader.cpp @@ -70,7 +70,7 @@ namespace binary_loader std::string result(reinterpret_cast(diff.data()), diff.size()); result.append(reinterpret_cast(&size), sizeof(size)); - result = utils::compression::zlib::compress(result); + result = utils::compression::zstd::compress(result); utils::io::write_file(file + ".diff", result); } @@ -115,7 +115,7 @@ namespace binary_loader } auto delta = load_delta(mode); - delta = utils::compression::zlib::decompress(delta); + delta = utils::compression::zstd::decompress(delta); return build_binary(base, delta); } } diff --git a/src/resources/iw5mp.exe.diff b/src/resources/iw5mp.exe.diff index 68ce39a..3afc04d 100644 Binary files a/src/resources/iw5mp.exe.diff and b/src/resources/iw5mp.exe.diff differ diff --git a/src/resources/iw5sp.exe.diff b/src/resources/iw5sp.exe.diff index 66834a7..113a039 100644 Binary files a/src/resources/iw5sp.exe.diff and b/src/resources/iw5sp.exe.diff differ diff --git a/src/std_include.hpp b/src/std_include.hpp index 5995802..675d2e0 100644 --- a/src/std_include.hpp +++ b/src/std_include.hpp @@ -51,6 +51,7 @@ #include #include +#include #include #include #include diff --git a/src/utils/compression.cpp b/src/utils/compression.cpp index e04add9..57dfed5 100644 --- a/src/utils/compression.cpp +++ b/src/utils/compression.cpp @@ -67,4 +67,26 @@ namespace utils::compression inflateEnd(&stream); return buffer; } + + std::string zstd::compress(const std::string& data) + { + memory::allocator allocator; + const auto bound = ZSTD_compressBound(data.size()); + + auto* buffer = allocator.allocate_array(bound); + const auto size = ZSTD_compress(buffer, bound, data.data(), data.size(), ZSTD_maxCLevel()); + + return std::string(buffer, size); + } + + std::string zstd::decompress(const std::string& data) + { + memory::allocator allocator; + const auto bound = size_t(ZSTD_getFrameContentSize(data.data(), data.size())); + + auto* buffer = allocator.allocate_array(bound); + const auto size = ZSTD_decompress(buffer, bound, data.data(), data.size()); + + return std::string(buffer, size); + } } diff --git a/src/utils/compression.hpp b/src/utils/compression.hpp index d09ff9e..80e62a6 100644 --- a/src/utils/compression.hpp +++ b/src/utils/compression.hpp @@ -10,4 +10,11 @@ namespace utils::compression static std::string compress(const std::string& data); static std::string decompress(const std::string& data); }; + + class zstd final + { + public: + static std::string compress(const std::string& data); + static std::string decompress(const std::string& data); + }; };