From fb0479a8bdc3364babc9bf10f19ba8e888b9d2d6 Mon Sep 17 00:00:00 2001 From: Vollstrecker Date: Thu, 1 Jan 2026 13:20:21 +0100 Subject: CMake: Added contrib/puff. --- contrib/CMakeLists.txt | 1 + contrib/puff/CMakeLists.txt | 137 ++++++++++++++++++++++++++++++++++++++++++ contrib/puff/bin-writer.c | 26 ++++++++ contrib/puff/tester-cov.cmake | 56 +++++++++++++++++ contrib/puff/tester.cmake | 15 +++++ 5 files changed, 235 insertions(+) create mode 100644 contrib/puff/CMakeLists.txt create mode 100644 contrib/puff/bin-writer.c create mode 100644 contrib/puff/tester-cov.cmake create mode 100644 contrib/puff/tester.cmake diff --git a/contrib/CMakeLists.txt b/contrib/CMakeLists.txt index 18f86c4a..fab97acd 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 00000000..f7418fd7 --- /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 + "$" + "${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 + "$" + "${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 + "$" + "${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 + "$" + "${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 00000000..cfd8306a --- /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 00000000..5dc9662e --- /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 = "$" +#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 00000000..d29dc5c3 --- /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 = "$" +#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) -- cgit v1.2.3-55-g6feb