From 6ef1d401bb84be7385873e61bc52598418cd9772 Mon Sep 17 00:00:00 2001 From: Jocadbz Date: Sun, 12 May 2024 17:24:58 -0300 Subject: [PATCH] lib: Add zlibutil library and test script --- resources/region_files/first_chunk.sh | 0 scripts/build.sh | 2 +- scripts/test/hexnet.sh | 0 scripts/test/zlibutil.sh | 26 +++++++ src/lib/zlibutil.cpp | 107 ++++++++++++++++++++++++++ src/lib/zlibutil.hpp | 27 +++++++ src/tools/zlibutil.cpp | 74 +----------------- 7 files changed, 163 insertions(+), 73 deletions(-) mode change 100755 => 100644 resources/region_files/first_chunk.sh mode change 100644 => 100755 scripts/test/hexnet.sh create mode 100755 scripts/test/zlibutil.sh create mode 100644 src/lib/zlibutil.cpp create mode 100644 src/lib/zlibutil.hpp diff --git a/resources/region_files/first_chunk.sh b/resources/region_files/first_chunk.sh old mode 100755 new mode 100644 diff --git a/scripts/build.sh b/scripts/build.sh index 350421a..3e90458 100755 --- a/scripts/build.sh +++ b/scripts/build.sh @@ -62,7 +62,7 @@ COMPILE_COMMANDS=( "$CXX_WITH_FLAGS src/tools/dumpnbt.cpp -I./include -Lbin/lib -l:nbt.so -l:cli.so -o bin/tools/dumpnbt" "$CXX_WITH_FLAGS src/tools/arraydump.cpp -I./include -Lbin/lib -l:file.so -l:cli.so -o bin/tools/arraydump" "$CXX_WITH_FLAGS src/tools/baseconvert.cpp -I./include -Lbin/lib -l:cli.so -o bin/tools/baseconvert" - "$CXX_WITH_FLAGS src/tools/zlibutil.cpp -I./include -Lbin/lib -l:cli.so -l:libz.so -l:file.so -o bin/tools/zlibutil" + "$CXX_WITH_FLAGS src/tools/zlibutil.cpp -I./include -Lbin/lib -l:cli.so -l:libz.so -l:file.so -l:zlibutil.so -o bin/tools/zlibutil" "$CXX_WITH_FLAGS -pthread src/tools/hexnet.cpp -I./include -Lbin/lib -l:cli.so -l:libsockpp.so -o bin/tools/hexnet" "$CXX_WITH_FLAGS -DFOSSVG_DEBUG src/fossvg.cpp -I./include -Lbin/lib -l:file.so -l:cli.so -lglfw -lvulkan -o bin/fossvg" "$CXX_WITH_FLAGS src/fossvgd.cpp -I./include -Lbin/lib -l:cli.so -o bin/fossvgd" diff --git a/scripts/test/hexnet.sh b/scripts/test/hexnet.sh old mode 100644 new mode 100755 diff --git a/scripts/test/zlibutil.sh b/scripts/test/zlibutil.sh new file mode 100755 index 0000000..c29e5fd --- /dev/null +++ b/scripts/test/zlibutil.sh @@ -0,0 +1,26 @@ +#!/usr/bin/env bash +echo "================================================================================" +echo -n "Testing \`zlibutil\`... " + + +echo "abc" >> testfile + +bin/tools/zlibutil -c testfile + +if [ "$(bin/tools/arraydump --binary testfile.compressed)" = "{0b01111000, 0b10011100, 0b01001011, 0b01001100, 0b01001010, 0b11100110, 0b00000010, 0b00000000, 0b00000011, 0b01111110, 0b00000001, 0b00110001}" ]; then + echo -n "Compression Test: PASS... " +else + echo -n "Compression Test: FAILED... " +fi + +bin/tools/zlibutil -d testfile.compressed + +if [ "$(bin/tools/arraydump --binary testfile.compressed.uncompressed)" = "{0b01100001, 0b01100010, 0b01100011, 0b00001010}" ]; then + echo "Decompression Test: PASS" +else + echo "Decompression Test: FAILED" +fi + +rm testfile testfile.compressed testfile.compressed.uncompressed + +echo "================================================================================" diff --git a/src/lib/zlibutil.cpp b/src/lib/zlibutil.cpp new file mode 100644 index 0000000..d9f1a85 --- /dev/null +++ b/src/lib/zlibutil.cpp @@ -0,0 +1,107 @@ +// Copyright 2022, FOSS-VG Developers and Contributers +// +// Author(s): +// Jocadbz +// +// This program is free software: you can redistribute it and/or modify it +// under the terms of the GNU Affero General Public License as published +// by the Free Software Foundation, version 3. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied +// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// version 3 along with this program. +// If not, see https://www.gnu.org/licenses/agpl-3.0.en.html + +#include "../lib/zlibutil.hpp" + +#include +#include +#include +#include +#include +#include +#include + +#include "../lib/cli.hpp" +#include "../lib/file.hpp" + +#define EXIT_SUCCESS 0 +#define EXIT_RUNTIME 1 +#define EXIT_USAGE 2 + +#include +#include +#include +#include + +#define CHUNK_SIZE 16384 // Chunk size + + +std::vector compressData(const char* data, int size) { + z_stream zs; + memset(&zs, 0, sizeof(zs)); + + if (deflateInit(&zs, Z_DEFAULT_COMPRESSION) != Z_OK) + throw(std::runtime_error("deflateInit failed while compressing.")); + + zs.next_in = reinterpret_cast(const_cast(data)); + zs.avail_in = size; + + int ret; + char outbuffer[CHUNK_SIZE]; + std::vector compressedData; + + do { + zs.next_out = reinterpret_cast(outbuffer); + zs.avail_out = CHUNK_SIZE; + + ret = deflate(&zs, Z_FINISH); + + if (compressedData.size() < zs.total_out) + compressedData.insert(compressedData.end(), outbuffer, outbuffer + CHUNK_SIZE - zs.avail_out); + } while (ret == Z_OK); + + deflateEnd(&zs); + + if (ret != Z_STREAM_END) + throw(std::runtime_error("Error while compressing: " + std::to_string(ret))); + + return compressedData; +} + + +std::vector decompressData(const char* data, int size) { + z_stream zs; + memset(&zs, 0, sizeof(zs)); + + if (inflateInit(&zs) != Z_OK) + throw(std::runtime_error("inflateInit failed while decompressing.")); + + zs.next_in = reinterpret_cast(const_cast(data)); + zs.avail_in = size; + + int ret; + char outbuffer[CHUNK_SIZE]; + std::vector decompressedData; + + do { + zs.next_out = reinterpret_cast(outbuffer); + zs.avail_out = CHUNK_SIZE; + + ret = inflate(&zs, 0); + + if (decompressedData.size() < zs.total_out) + decompressedData.insert(decompressedData.end(), outbuffer, outbuffer + CHUNK_SIZE - zs.avail_out); + } while (ret == Z_OK); + + inflateEnd(&zs); + + if (ret != Z_STREAM_END) + throw(std::runtime_error("Error while decompressing: " + std::to_string(ret))); + + return decompressedData; +} diff --git a/src/lib/zlibutil.hpp b/src/lib/zlibutil.hpp new file mode 100644 index 0000000..3be3de2 --- /dev/null +++ b/src/lib/zlibutil.hpp @@ -0,0 +1,27 @@ +// Copyright 2024, FOSS-VG Developers and Contributers +// +// Author(s): +// Jocadbz +// +// This program is free software: you can redistribute it and/or modify it +// under the terms of the GNU Affero General Public License as published +// by the Free Software Foundation, version 3. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied +// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// version 3 along with this program. +// If not, see https://www.gnu.org/licenses/agpl-3.0.en.html + +#include + +#ifndef ZLIBUTIL_H +#define ZLIBUTIL_H + +std::vector compressData(const char* data, int size); +std::vector decompressData(const char* data, int size); + +#endif // ZLIBUTIL_H diff --git a/src/tools/zlibutil.cpp b/src/tools/zlibutil.cpp index b58a92d..97cdfe0 100644 --- a/src/tools/zlibutil.cpp +++ b/src/tools/zlibutil.cpp @@ -1,4 +1,4 @@ -// Copyright 2022, FOSS-VG Developers and Contributers +// Copyright 2024, FOSS-VG Developers and Contributers // // Author(s): // Jocadbz @@ -26,83 +26,13 @@ #include "../lib/cli.hpp" #include "../lib/file.hpp" +#include "../lib/zlibutil.hpp" #define EXIT_SUCCESS 0 #define EXIT_RUNTIME 1 #define EXIT_USAGE 2 -#include -#include -#include -#include -#define CHUNK_SIZE 16384 // Chunk size - - -std::vector compressData(const char* data, int size) { - z_stream zs; - memset(&zs, 0, sizeof(zs)); - - if (deflateInit(&zs, Z_DEFAULT_COMPRESSION) != Z_OK) - throw(std::runtime_error("deflateInit failed while compressing.")); - - zs.next_in = reinterpret_cast(const_cast(data)); - zs.avail_in = size; - - int ret; - char outbuffer[CHUNK_SIZE]; - std::vector compressedData; - - do { - zs.next_out = reinterpret_cast(outbuffer); - zs.avail_out = CHUNK_SIZE; - - ret = deflate(&zs, Z_FINISH); - - if (compressedData.size() < zs.total_out) - compressedData.insert(compressedData.end(), outbuffer, outbuffer + CHUNK_SIZE - zs.avail_out); - } while (ret == Z_OK); - - deflateEnd(&zs); - - if (ret != Z_STREAM_END) - throw(std::runtime_error("Error while compressing: " + std::to_string(ret))); - - return compressedData; -} - - -std::vector decompressData(const char* data, int size) { - z_stream zs; - memset(&zs, 0, sizeof(zs)); - - if (inflateInit(&zs) != Z_OK) - throw(std::runtime_error("inflateInit failed while decompressing.")); - - zs.next_in = reinterpret_cast(const_cast(data)); - zs.avail_in = size; - - int ret; - char outbuffer[CHUNK_SIZE]; - std::vector decompressedData; - - do { - zs.next_out = reinterpret_cast(outbuffer); - zs.avail_out = CHUNK_SIZE; - - ret = inflate(&zs, 0); - - if (decompressedData.size() < zs.total_out) - decompressedData.insert(decompressedData.end(), outbuffer, outbuffer + CHUNK_SIZE - zs.avail_out); - } while (ret == Z_OK); - - inflateEnd(&zs); - - if (ret != Z_STREAM_END) - throw(std::runtime_error("Error while decompressing: " + std::to_string(ret))); - - return decompressedData; -} /* Finnaly, the main file