CMake: Added contrib/puff.

This commit is contained in:
Vollstrecker 2026-01-01 13:20:21 +01:00 committed by Mark Adler
parent 89889debe3
commit fb0479a8bd
5 changed files with 235 additions and 0 deletions

View File

@ -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)

137
contrib/puff/CMakeLists.txt Normal file
View File

@ -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)

26
contrib/puff/bin-writer.c Normal file
View File

@ -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;
}

View File

@ -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)

15
contrib/puff/tester.cmake Normal file
View File

@ -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)