Commit fb0479a for zlib

commit fb0479a8bdc3364babc9bf10f19ba8e888b9d2d6
Author: Vollstrecker <werner@vollstreckernet.de>
Date:   Thu Jan 1 13:20:21 2026 +0100

    CMake: Added contrib/puff.

diff --git a/contrib/CMakeLists.txt b/contrib/CMakeLists.txt
index 18f86c4..fab97ac 100644
--- a/contrib/CMakeLists.txt
+++ b/contrib/CMakeLists.txt
@@ -37,3 +37,4 @@ zlib_add_contrib_lib(ADA "Ada bindings" ada)
 zlib_add_contrib_lib(BLAST "blast binary" blast)
 zlib_add_contrib_lib(IOSTREAM3 "IOStream C++ bindings V3" iostream3)
 zlib_add_contrib_lib(MINIZIP "minizip library" minizip)
+zlib_add_contrib_lib(PUFF "puff decompress library" puff)
diff --git a/contrib/puff/CMakeLists.txt b/contrib/puff/CMakeLists.txt
new file mode 100644
index 0000000..f7418fd
--- /dev/null
+++ b/contrib/puff/CMakeLists.txt
@@ -0,0 +1,137 @@
+cmake_minimum_required(VERSION 3.12...3.31)
+
+project(
+    iostreamsV3
+    VERSION 1.0.0
+    LANGUAGES C
+    DESCRIPTION "A library for decompressing deflate with very little footprint"
+    HOMEPAGE_URL "https://www.zlib.net")
+
+option(ZLIB_PUFF_BUILD_SHARED "Enable building blast shared library" ON)
+option(ZLIB_PUFF_BUILD_STATIC "Enable building blast static library" ON)
+option(ZLIB_PUFF_BUILD_TESTING "Enable building tests for blast" ON)
+
+if(NOT DEFINED ZLIB_BUILD_PUFF)
+    if(ZLIB_PUFF_BUILD_SHARED)
+        list(APPEND REQUIRED_COMPONENTS "shared")
+    endif(ZLIB_PUFF_BUILD_SHARED)
+
+    if(ZLIB_PUFF_BUILD_STATIC)
+        list(APPEND REQUIRED_COMPONENTS "static")
+    endif(ZLIB_PUFF_BUILD_STATIC)
+
+    find_package(ZLIB REQUIRED COMPONENTS ${REQUIRED_COMPONENTS} CONFIG)
+endif(NOT DEFINED ZLIB_BUILD_PUFF)
+
+if(WIN32 OR CYGWIN)
+    set(zlibpuff_static_suffix "s")
+    set(CMAKE_DEBUG_POSTFIX "d")
+endif(WIN32 OR CYGWIN)
+
+if(ZLIB_PUFF_BUILD_TESTING)
+    add_executable(bin-writer bin-writer.c)
+
+    if(${CMAKE_C_COMPILER_ID} STREQUAL "GNU" OR
+       ${CMAKE_C_COMPILER_ID} STREQUAL "Clang")
+        set(CFLAGS_OLD ${CMAKE_C_FLAGS})
+        set(CMAKE_C_FLAGS
+            ""
+            CACHE STRING "" FORCE)
+
+        if(${CMAKE_C_COMPILER_ID} STREQUAL "GNU")
+            find_program(GCOV_EXECUTABLE gcov)
+        endif(${CMAKE_C_COMPILER_ID} STREQUAL "GNU")
+
+        if(${CMAKE_C_COMPILER_ID} STREQUAL "Clang")
+            set(llvm_names llvm_cov)
+            list(APPEND llvm_names llvm-cov)
+
+            foreach(ver RANGE 11 99)
+                list(APPEND llvm_names llvm-cov-${ver})
+            endforeach(ver RANGE 11 99)
+
+            find_program(GCOV_EXECUTABLE NAMES ${llvm_names})
+            set(llvm_option "gcov")
+        endif(${CMAKE_C_COMPILER_ID} STREQUAL "Clang")
+    endif(${CMAKE_C_COMPILER_ID} STREQUAL "GNU" OR
+          ${CMAKE_C_COMPILER_ID} STREQUAL "Clang")
+endif(ZLIB_PUFF_BUILD_TESTING)
+
+if(ZLIB_PUFF_BUILD_SHARED)
+    add_library(zlib-puff SHARED
+                puff.c
+                puff.h)
+
+    if(ZLIB_PUFF_BUILD_TESTING)
+        enable_testing()
+
+        add_executable(puff-test pufftest.c)
+
+        target_link_libraries(puff-test
+            PRIVATE zlib-puff)
+
+        add_test(NAME zlib_puff_test
+            COMMAND ${CMAKE_COMMAND} -P
+                    ${CMAKE_CURRENT_SOURCE_DIR}/tester.cmake
+                    "$<TARGET_FILE:puff-test>"
+                    "${CMAKE_CURRENT_SOURCE_DIR}")
+
+        if(GCOV_EXECUTABLE)
+            add_executable(puff-test-coverage pufftest.c puff.c)
+
+            target_compile_options(puff-test-coverage PRIVATE -coverage)
+
+            target_link_options(puff-test-coverage PRIVATE -coverage)
+
+            add_test(NAME zlib_puff_test_coverage
+                COMMAND ${CMAKE_COMMAND} -P
+                        ${CMAKE_CURRENT_SOURCE_DIR}/tester-cov.cmake
+                        "$<TARGET_FILE:puff-test-coverage>"
+                        "${CMAKE_CURRENT_SOURCE_DIR}"
+                        "${CMAKE_CURRENT_BINARY_DIR}"
+                        ${GCOV_EXECUTABLE}
+                        ${llvm_option})
+        endif(GCOV_EXECUTABLE)
+    endif(ZLIB_PUFF_BUILD_TESTING)
+endif(ZLIB_PUFF_BUILD_SHARED)
+
+if(ZLIB_PUFF_BUILD_STATIC)
+    add_library(zlib-puffStatic STATIC
+                puff.c
+                puff.h)
+
+    set_target_properties(zlib-puffStatic
+        PROPERTIES
+            OUTPUT_NAME zlib-puff${zlib_puff_static_suffix})
+
+    if(ZLIB_PUFF_BUILD_TESTING)
+        enable_testing()
+
+        add_executable(puff-testStatic pufftest.c)
+
+        target_link_libraries(puff-testStatic
+            PRIVATE zlib-puffStatic)
+        add_test(NAME zlib_puff_testStatic
+            COMMAND ${CMAKE_COMMAND} -P
+                    ${CMAKE_CURRENT_SOURCE_DIR}/tester.cmake
+                    "$<TARGET_FILE:puff-testStatic>"
+                    "${CMAKE_CURRENT_SOURCE_DIR}")
+
+        if(GCOV_EXECUTABLE)
+            add_executable(puff-testStatic-coverage pufftest.c puff.c)
+
+            target_compile_options(puff-testStatic-coverage PRIVATE -coverage)
+
+            target_link_options(puff-testStatic-coverage PRIVATE -coverage)
+
+            add_test(NAME zlib_puff_testStatic_coverage
+                COMMAND ${CMAKE_COMMAND} -P
+                    ${CMAKE_CURRENT_SOURCE_DIR}/tester-cov.cmake
+                    "$<TARGET_FILE:puff-testStatic-coverage>"
+                    "${CMAKE_CURRENT_SOURCE_DIR}"
+                    "${CMAKE_CURRENT_BINARY_DIR}"
+                    ${GCOV_EXECUTABLE}
+                    ${llvm_option})
+        endif(GCOV_EXECUTABLE)
+    endif(ZLIB_PUFF_BUILD_TESTING)
+endif(ZLIB_PUFF_BUILD_STATIC)
diff --git a/contrib/puff/bin-writer.c b/contrib/puff/bin-writer.c
new file mode 100644
index 0000000..cfd8306
--- /dev/null
+++ b/contrib/puff/bin-writer.c
@@ -0,0 +1,26 @@
+#include "stdio.h"
+#include "stdlib.h"
+
+/**
+ * Reads hexadecimal values from stdin and writes binary bytes to stdout.
+ * Accepts hex values separated by spaces, newlines, commas, etc.
+ * Handles both uppercase and lowercase hex digits.
+ */
+int main(void) {
+    char hexStr[3]; // Two hex digits + null terminator
+    int ch;
+
+    // Read characters until EOF
+    while((ch = getchar()) != EOF) {
+        hexStr[0] = (char)ch;
+        hexStr[1] = (char)getchar();
+        hexStr[2] = '\0'; // Null-terminate string
+        char *endptr;
+        unsigned char byte = (unsigned char)strtol(hexStr, &endptr, 16);
+        fwrite(&byte, 1, 1, stdout);
+        if((ch = getchar()) == EOF) // Read seaparating space
+          break;
+    }
+
+    return 0;
+}
diff --git a/contrib/puff/tester-cov.cmake b/contrib/puff/tester-cov.cmake
new file mode 100644
index 0000000..5dc9662
--- /dev/null
+++ b/contrib/puff/tester-cov.cmake
@@ -0,0 +1,56 @@
+cmake_minimum_required(VERSION 3.12...3.31)
+
+#CMAKE_ARGV0 = ${CMAKE_COMMAND}
+#CMAKE_ARGV1 = -P
+#CMAKE_ARGV2 = ${CMAKE_CURRENT_SOURCE_DIR}/tester-cov.cmake
+#CMAKE_ARGV3 = "$<TARGET_FILE:puff-test-cov>"
+#CMAKE_ARGV4 = "${CMAKE_CURRENT_SOURCE_DIR}"
+#CMAKE_ARGV5 = "${CMAKE_CURRENT_BINARY_DIR}"
+#CMAKE_ARGV6 = GCOV_EXECUTABLE
+#CMAKE_ARGV7 = GCOV_EXECUTABLE
+
+function(puff_cov_test test_string expected_result)
+    execute_process(COMMAND ${CMAKE_ARGV0} -E echo_append ${test_string}
+                    COMMAND ${CMAKE_ARGV5}/bin-writer
+                    COMMAND ${CMAKE_ARGV3}
+                    RESULT_VARIABLE RESULT)
+
+    if(NOT RESULT EQUAL expected_result)
+        message(FATAL_ERROR "${RESULT} not matching ${expected_result}")
+    endif(NOT RESULT EQUAL expected_result)
+endfunction(puff_cov_test test_string expected_result)
+
+execute_process(COMMAND ${CMAKE_ARGV3} -w ${CMAKE_ARGV4}/zeros.raw)
+
+puff_cov_test("04" "2")
+puff_cov_test("00" "2")
+puff_cov_test("00 00 00 00 00" "254")
+puff_cov_test("00 01 00 fe ff" "2")
+
+execute_process(COMMAND ${CMAKE_ARGV0} -E echo_append "01 01 00 fe ff 0a"
+                COMMAND ${CMAKE_ARGV5}/bin-writer
+                COMMAND ${CMAKE_ARGV3})
+
+puff_cov_test("02 7e ff ff" "246")
+puff_cov_test("02" "2")
+puff_cov_test("04 80 49 92 24 49 92 24 0f b4 ff ff c3 04" "2")
+puff_cov_test("04 80 49 92 24 49 92 24 71 ff ff 93 11 00" "249")
+puff_cov_test("04 c0 81 08 00 00 00 00 20 7f eb 0b 00 00" "246")
+
+execute_process(COMMAND ${CMAKE_ARGV0} -E echo_append "0b 00 00"
+                COMMAND ${CMAKE_ARGV5}/bin-writer
+                COMMAND ${CMAKE_ARGV3})
+
+puff_cov_test("1a 07" "246")
+puff_cov_test("0c c0 81 00 00 00 00 00 90 ff 6b 04" "245")
+
+execute_process(COMMAND ${CMAKE_ARGV3} -f ${CMAKE_ARGV4}/zeros.raw)
+
+puff_cov_test("fc 00 00" "253")
+puff_cov_test("04 00 fe ff" "252")
+puff_cov_test("04 00 24 49" "251")
+puff_cov_test("04 80 49 92 24 49 92 24 0f b4 ff ff c3 84" "248")
+puff_cov_test("04 00 24 e9 ff ff" "250")
+puff_cov_test("04 00 24 e9 ff 6d" "247")
+
+execute_process(COMMAND ${CMAKE_ARGV6} ${CMAKE_ARGV7} -n puff.c.gcno)
diff --git a/contrib/puff/tester.cmake b/contrib/puff/tester.cmake
new file mode 100644
index 0000000..d29dc5c
--- /dev/null
+++ b/contrib/puff/tester.cmake
@@ -0,0 +1,15 @@
+cmake_minimum_required(VERSION 3.12...3.31)
+
+#CMAKE_ARGV0 = ${CMAKE_COMMAND}
+#CMAKE_ARGV1 = -P
+#CMAKE_ARGV2 = ${CMAKE_CURRENT_SOURCE_DIR}/tester.cmake
+#CMAKE_ARGV3 = "$<TARGET_FILE:puf-test>"
+#CMAKE_ARGV4 = "${CMAKE_CURRENT_SOURCE_DIR}"
+
+execute_process(COMMAND ${CMAKE_ARGV3}
+                INPUT_FILE "${CMAKE_ARGV4}/zeros.raw"
+                RESULT_VARIABLE RESULT)
+
+if(RESULT)
+    message(FATAL_ERROR "Command exitited with: ${RESULT}")
+endif(RESULT)