diff options
| -rw-r--r-- | contrib/CMakeLists.txt | 1 | ||||
| -rw-r--r-- | contrib/puff/CMakeLists.txt | 137 | ||||
| -rw-r--r-- | contrib/puff/bin-writer.c | 26 | ||||
| -rw-r--r-- | contrib/puff/tester-cov.cmake | 56 | ||||
| -rw-r--r-- | contrib/puff/tester.cmake | 15 |
5 files changed, 235 insertions, 0 deletions
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) | |||
| 37 | zlib_add_contrib_lib(BLAST "blast binary" blast) | 37 | zlib_add_contrib_lib(BLAST "blast binary" blast) |
| 38 | zlib_add_contrib_lib(IOSTREAM3 "IOStream C++ bindings V3" iostream3) | 38 | zlib_add_contrib_lib(IOSTREAM3 "IOStream C++ bindings V3" iostream3) |
| 39 | zlib_add_contrib_lib(MINIZIP "minizip library" minizip) | 39 | zlib_add_contrib_lib(MINIZIP "minizip library" minizip) |
| 40 | 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 @@ | |||
| 1 | cmake_minimum_required(VERSION 3.12...3.31) | ||
| 2 | |||
| 3 | project( | ||
| 4 | iostreamsV3 | ||
| 5 | VERSION 1.0.0 | ||
| 6 | LANGUAGES C | ||
| 7 | DESCRIPTION "A library for decompressing deflate with very little footprint" | ||
| 8 | HOMEPAGE_URL "https://www.zlib.net") | ||
| 9 | |||
| 10 | option(ZLIB_PUFF_BUILD_SHARED "Enable building blast shared library" ON) | ||
| 11 | option(ZLIB_PUFF_BUILD_STATIC "Enable building blast static library" ON) | ||
| 12 | option(ZLIB_PUFF_BUILD_TESTING "Enable building tests for blast" ON) | ||
| 13 | |||
| 14 | if(NOT DEFINED ZLIB_BUILD_PUFF) | ||
| 15 | if(ZLIB_PUFF_BUILD_SHARED) | ||
| 16 | list(APPEND REQUIRED_COMPONENTS "shared") | ||
| 17 | endif(ZLIB_PUFF_BUILD_SHARED) | ||
| 18 | |||
| 19 | if(ZLIB_PUFF_BUILD_STATIC) | ||
| 20 | list(APPEND REQUIRED_COMPONENTS "static") | ||
| 21 | endif(ZLIB_PUFF_BUILD_STATIC) | ||
| 22 | |||
| 23 | find_package(ZLIB REQUIRED COMPONENTS ${REQUIRED_COMPONENTS} CONFIG) | ||
| 24 | endif(NOT DEFINED ZLIB_BUILD_PUFF) | ||
| 25 | |||
| 26 | if(WIN32 OR CYGWIN) | ||
| 27 | set(zlibpuff_static_suffix "s") | ||
| 28 | set(CMAKE_DEBUG_POSTFIX "d") | ||
| 29 | endif(WIN32 OR CYGWIN) | ||
| 30 | |||
| 31 | if(ZLIB_PUFF_BUILD_TESTING) | ||
| 32 | add_executable(bin-writer bin-writer.c) | ||
| 33 | |||
| 34 | if(${CMAKE_C_COMPILER_ID} STREQUAL "GNU" OR | ||
| 35 | ${CMAKE_C_COMPILER_ID} STREQUAL "Clang") | ||
| 36 | set(CFLAGS_OLD ${CMAKE_C_FLAGS}) | ||
| 37 | set(CMAKE_C_FLAGS | ||
| 38 | "" | ||
| 39 | CACHE STRING "" FORCE) | ||
| 40 | |||
| 41 | if(${CMAKE_C_COMPILER_ID} STREQUAL "GNU") | ||
| 42 | find_program(GCOV_EXECUTABLE gcov) | ||
| 43 | endif(${CMAKE_C_COMPILER_ID} STREQUAL "GNU") | ||
| 44 | |||
| 45 | if(${CMAKE_C_COMPILER_ID} STREQUAL "Clang") | ||
| 46 | set(llvm_names llvm_cov) | ||
| 47 | list(APPEND llvm_names llvm-cov) | ||
| 48 | |||
| 49 | foreach(ver RANGE 11 99) | ||
| 50 | list(APPEND llvm_names llvm-cov-${ver}) | ||
| 51 | endforeach(ver RANGE 11 99) | ||
| 52 | |||
| 53 | find_program(GCOV_EXECUTABLE NAMES ${llvm_names}) | ||
| 54 | set(llvm_option "gcov") | ||
| 55 | endif(${CMAKE_C_COMPILER_ID} STREQUAL "Clang") | ||
| 56 | endif(${CMAKE_C_COMPILER_ID} STREQUAL "GNU" OR | ||
| 57 | ${CMAKE_C_COMPILER_ID} STREQUAL "Clang") | ||
| 58 | endif(ZLIB_PUFF_BUILD_TESTING) | ||
| 59 | |||
| 60 | if(ZLIB_PUFF_BUILD_SHARED) | ||
| 61 | add_library(zlib-puff SHARED | ||
| 62 | puff.c | ||
| 63 | puff.h) | ||
| 64 | |||
| 65 | if(ZLIB_PUFF_BUILD_TESTING) | ||
| 66 | enable_testing() | ||
| 67 | |||
| 68 | add_executable(puff-test pufftest.c) | ||
| 69 | |||
| 70 | target_link_libraries(puff-test | ||
| 71 | PRIVATE zlib-puff) | ||
| 72 | |||
| 73 | add_test(NAME zlib_puff_test | ||
| 74 | COMMAND ${CMAKE_COMMAND} -P | ||
| 75 | ${CMAKE_CURRENT_SOURCE_DIR}/tester.cmake | ||
| 76 | "$<TARGET_FILE:puff-test>" | ||
| 77 | "${CMAKE_CURRENT_SOURCE_DIR}") | ||
| 78 | |||
| 79 | if(GCOV_EXECUTABLE) | ||
| 80 | add_executable(puff-test-coverage pufftest.c puff.c) | ||
| 81 | |||
| 82 | target_compile_options(puff-test-coverage PRIVATE -coverage) | ||
| 83 | |||
| 84 | target_link_options(puff-test-coverage PRIVATE -coverage) | ||
| 85 | |||
| 86 | add_test(NAME zlib_puff_test_coverage | ||
| 87 | COMMAND ${CMAKE_COMMAND} -P | ||
| 88 | ${CMAKE_CURRENT_SOURCE_DIR}/tester-cov.cmake | ||
| 89 | "$<TARGET_FILE:puff-test-coverage>" | ||
| 90 | "${CMAKE_CURRENT_SOURCE_DIR}" | ||
| 91 | "${CMAKE_CURRENT_BINARY_DIR}" | ||
| 92 | ${GCOV_EXECUTABLE} | ||
| 93 | ${llvm_option}) | ||
| 94 | endif(GCOV_EXECUTABLE) | ||
| 95 | endif(ZLIB_PUFF_BUILD_TESTING) | ||
| 96 | endif(ZLIB_PUFF_BUILD_SHARED) | ||
| 97 | |||
| 98 | if(ZLIB_PUFF_BUILD_STATIC) | ||
| 99 | add_library(zlib-puffStatic STATIC | ||
| 100 | puff.c | ||
| 101 | puff.h) | ||
| 102 | |||
| 103 | set_target_properties(zlib-puffStatic | ||
| 104 | PROPERTIES | ||
| 105 | OUTPUT_NAME zlib-puff${zlib_puff_static_suffix}) | ||
| 106 | |||
| 107 | if(ZLIB_PUFF_BUILD_TESTING) | ||
| 108 | enable_testing() | ||
| 109 | |||
| 110 | add_executable(puff-testStatic pufftest.c) | ||
| 111 | |||
| 112 | target_link_libraries(puff-testStatic | ||
| 113 | PRIVATE zlib-puffStatic) | ||
| 114 | add_test(NAME zlib_puff_testStatic | ||
| 115 | COMMAND ${CMAKE_COMMAND} -P | ||
| 116 | ${CMAKE_CURRENT_SOURCE_DIR}/tester.cmake | ||
| 117 | "$<TARGET_FILE:puff-testStatic>" | ||
| 118 | "${CMAKE_CURRENT_SOURCE_DIR}") | ||
| 119 | |||
| 120 | if(GCOV_EXECUTABLE) | ||
| 121 | add_executable(puff-testStatic-coverage pufftest.c puff.c) | ||
| 122 | |||
| 123 | target_compile_options(puff-testStatic-coverage PRIVATE -coverage) | ||
| 124 | |||
| 125 | target_link_options(puff-testStatic-coverage PRIVATE -coverage) | ||
| 126 | |||
| 127 | add_test(NAME zlib_puff_testStatic_coverage | ||
| 128 | COMMAND ${CMAKE_COMMAND} -P | ||
| 129 | ${CMAKE_CURRENT_SOURCE_DIR}/tester-cov.cmake | ||
| 130 | "$<TARGET_FILE:puff-testStatic-coverage>" | ||
| 131 | "${CMAKE_CURRENT_SOURCE_DIR}" | ||
| 132 | "${CMAKE_CURRENT_BINARY_DIR}" | ||
| 133 | ${GCOV_EXECUTABLE} | ||
| 134 | ${llvm_option}) | ||
| 135 | endif(GCOV_EXECUTABLE) | ||
| 136 | endif(ZLIB_PUFF_BUILD_TESTING) | ||
| 137 | 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 @@ | |||
| 1 | #include "stdio.h" | ||
| 2 | #include "stdlib.h" | ||
| 3 | |||
| 4 | /** | ||
| 5 | * Reads hexadecimal values from stdin and writes binary bytes to stdout. | ||
| 6 | * Accepts hex values separated by spaces, newlines, commas, etc. | ||
| 7 | * Handles both uppercase and lowercase hex digits. | ||
| 8 | */ | ||
| 9 | int main(void) { | ||
| 10 | char hexStr[3]; // Two hex digits + null terminator | ||
| 11 | int ch; | ||
| 12 | |||
| 13 | // Read characters until EOF | ||
| 14 | while((ch = getchar()) != EOF) { | ||
| 15 | hexStr[0] = (char)ch; | ||
| 16 | hexStr[1] = (char)getchar(); | ||
| 17 | hexStr[2] = '\0'; // Null-terminate string | ||
| 18 | char *endptr; | ||
| 19 | unsigned char byte = (unsigned char)strtol(hexStr, &endptr, 16); | ||
| 20 | fwrite(&byte, 1, 1, stdout); | ||
| 21 | if((ch = getchar()) == EOF) // Read seaparating space | ||
| 22 | break; | ||
| 23 | } | ||
| 24 | |||
| 25 | return 0; | ||
| 26 | } | ||
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 @@ | |||
| 1 | cmake_minimum_required(VERSION 3.12...3.31) | ||
| 2 | |||
| 3 | #CMAKE_ARGV0 = ${CMAKE_COMMAND} | ||
| 4 | #CMAKE_ARGV1 = -P | ||
| 5 | #CMAKE_ARGV2 = ${CMAKE_CURRENT_SOURCE_DIR}/tester-cov.cmake | ||
| 6 | #CMAKE_ARGV3 = "$<TARGET_FILE:puff-test-cov>" | ||
| 7 | #CMAKE_ARGV4 = "${CMAKE_CURRENT_SOURCE_DIR}" | ||
| 8 | #CMAKE_ARGV5 = "${CMAKE_CURRENT_BINARY_DIR}" | ||
| 9 | #CMAKE_ARGV6 = GCOV_EXECUTABLE | ||
| 10 | #CMAKE_ARGV7 = GCOV_EXECUTABLE | ||
| 11 | |||
| 12 | function(puff_cov_test test_string expected_result) | ||
| 13 | execute_process(COMMAND ${CMAKE_ARGV0} -E echo_append ${test_string} | ||
| 14 | COMMAND ${CMAKE_ARGV5}/bin-writer | ||
| 15 | COMMAND ${CMAKE_ARGV3} | ||
| 16 | RESULT_VARIABLE RESULT) | ||
| 17 | |||
| 18 | if(NOT RESULT EQUAL expected_result) | ||
| 19 | message(FATAL_ERROR "${RESULT} not matching ${expected_result}") | ||
| 20 | endif(NOT RESULT EQUAL expected_result) | ||
| 21 | endfunction(puff_cov_test test_string expected_result) | ||
| 22 | |||
| 23 | execute_process(COMMAND ${CMAKE_ARGV3} -w ${CMAKE_ARGV4}/zeros.raw) | ||
| 24 | |||
| 25 | puff_cov_test("04" "2") | ||
| 26 | puff_cov_test("00" "2") | ||
| 27 | puff_cov_test("00 00 00 00 00" "254") | ||
| 28 | puff_cov_test("00 01 00 fe ff" "2") | ||
| 29 | |||
| 30 | execute_process(COMMAND ${CMAKE_ARGV0} -E echo_append "01 01 00 fe ff 0a" | ||
| 31 | COMMAND ${CMAKE_ARGV5}/bin-writer | ||
| 32 | COMMAND ${CMAKE_ARGV3}) | ||
| 33 | |||
| 34 | puff_cov_test("02 7e ff ff" "246") | ||
| 35 | puff_cov_test("02" "2") | ||
| 36 | puff_cov_test("04 80 49 92 24 49 92 24 0f b4 ff ff c3 04" "2") | ||
| 37 | puff_cov_test("04 80 49 92 24 49 92 24 71 ff ff 93 11 00" "249") | ||
| 38 | puff_cov_test("04 c0 81 08 00 00 00 00 20 7f eb 0b 00 00" "246") | ||
| 39 | |||
| 40 | execute_process(COMMAND ${CMAKE_ARGV0} -E echo_append "0b 00 00" | ||
| 41 | COMMAND ${CMAKE_ARGV5}/bin-writer | ||
| 42 | COMMAND ${CMAKE_ARGV3}) | ||
| 43 | |||
| 44 | puff_cov_test("1a 07" "246") | ||
| 45 | puff_cov_test("0c c0 81 00 00 00 00 00 90 ff 6b 04" "245") | ||
| 46 | |||
| 47 | execute_process(COMMAND ${CMAKE_ARGV3} -f ${CMAKE_ARGV4}/zeros.raw) | ||
| 48 | |||
| 49 | puff_cov_test("fc 00 00" "253") | ||
| 50 | puff_cov_test("04 00 fe ff" "252") | ||
| 51 | puff_cov_test("04 00 24 49" "251") | ||
| 52 | puff_cov_test("04 80 49 92 24 49 92 24 0f b4 ff ff c3 84" "248") | ||
| 53 | puff_cov_test("04 00 24 e9 ff ff" "250") | ||
| 54 | puff_cov_test("04 00 24 e9 ff 6d" "247") | ||
| 55 | |||
| 56 | 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 @@ | |||
| 1 | cmake_minimum_required(VERSION 3.12...3.31) | ||
| 2 | |||
| 3 | #CMAKE_ARGV0 = ${CMAKE_COMMAND} | ||
| 4 | #CMAKE_ARGV1 = -P | ||
| 5 | #CMAKE_ARGV2 = ${CMAKE_CURRENT_SOURCE_DIR}/tester.cmake | ||
| 6 | #CMAKE_ARGV3 = "$<TARGET_FILE:puf-test>" | ||
| 7 | #CMAKE_ARGV4 = "${CMAKE_CURRENT_SOURCE_DIR}" | ||
| 8 | |||
| 9 | execute_process(COMMAND ${CMAKE_ARGV3} | ||
| 10 | INPUT_FILE "${CMAKE_ARGV4}/zeros.raw" | ||
| 11 | RESULT_VARIABLE RESULT) | ||
| 12 | |||
| 13 | if(RESULT) | ||
| 14 | message(FATAL_ERROR "Command exitited with: ${RESULT}") | ||
| 15 | endif(RESULT) | ||
