Commit 5ba29ae for zlib

commit 5ba29aea46bc135dcde7bcf88314b816d77a1cf6
Author: Vollstrecker <werner@vollstreckernet.de>
Date:   Tue Dec 30 17:42:52 2025 +0100

    CMake: Added contrib/blast.

diff --git a/contrib/CMakeLists.txt b/contrib/CMakeLists.txt
index cc4b331..63a838d 100644
--- a/contrib/CMakeLists.txt
+++ b/contrib/CMakeLists.txt
@@ -1,4 +1,5 @@
 option(ZLIB_BUILD_ADA "Enable building of Ada bindings" OFF)
+option(ZLIB_BUILD_BLAST "Enable building of blast binary" OFF)
 option(ZLIB_BUILD_MINIZIP "Enable building libminizip contrib library" OFF)

 if(ZLIB_BUILD_ADA)
@@ -8,6 +9,13 @@ if(ZLIB_BUILD_ADA)
     add_subdirectory(ada/)
 endif(ZLIB_BUILD_ADA)

+if(ZLIB_BUILD_BLAST)
+    set(ZLIBBLAST_BUILD_SHARED ${ZLIB_BUILD_SHARED})
+    set(ZLIBBLAST_BUILD_STATIC ${ZLIB_BUILD_STATIC})
+    set(ZLIBBLAST_BUILD_TESTING ${ZLIB_BUILD_TESTING})
+    add_subdirectory(blast/)
+endif(ZLIB_BUILD_BLAST)
+
 if(ZLIB_BUILD_MINIZIP)
     set(MINIZIP_BUILD_SHARED ${ZLIB_BUILD_SHARED})
     set(MINIZIP_BUILD_STATIC ${ZLIB_BUILD_STATIC})
diff --git a/contrib/blast/CMakeLists.txt b/contrib/blast/CMakeLists.txt
new file mode 100644
index 0000000..6357fcb
--- /dev/null
+++ b/contrib/blast/CMakeLists.txt
@@ -0,0 +1,81 @@
+cmake_minimum_required(VERSION 3.12...3.31)
+
+set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake/Modules")
+
+project(
+    blast
+    VERSION 1.3.0
+    LANGUAGES C
+    DESCRIPTION "A library for creating zipfiles based in zlib"
+    HOMEPAGE_URL "https://www.zlib.net")
+
+if(WIN32 OR CYGWIN)
+    set(zlibAda_static_suffix "s")
+    set(CMAKE_DEBUG_POSTFIX "d")
+endif(WIN32 OR CYGWIN)
+
+function(blast_findTestEnv testName)
+    set(testEnv "PATH=")
+
+    if(MSVC OR MINGW)
+        set(separator "\\\;")
+    else()
+        set(separator ":")
+    endif()
+
+    string(APPEND testEnv "$<TARGET_FILE_DIR:ZLIB::ZLIB>${separator}")
+    string(APPEND testEnv "$ENV{PATH}")
+
+    set_tests_properties(${testName} PROPERTIES ENVIRONMENT "${testEnv}")
+endfunction(blast_findTestEnv testName)
+
+if(ZLIBBLAST_BUILD_SHARED)
+    add_library(blast SHARED
+                blast.c
+                blast.h)
+
+    if(ZLIBBLAST_BUILD_TESTING)
+        enable_testing()
+        add_executable(blast-test blast-test.c)
+        target_link_libraries(blast-test blast)
+
+        add_test(NAME blast_blast-test
+            COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_SOURCE_DIR}/tester.cmake
+                    "$<TARGET_FILE:blast-test>"
+                    "${CMAKE_CURRENT_SOURCE_DIR}"
+                    "${CMAKE_CURRENT_BINARY_DIR}")
+
+        if(MSVC
+           OR MSYS
+           OR MINGW
+           OR CYGWIN)
+            blast_findtestenv(blast-test)
+        endif(
+            MSVC
+            OR MSYS
+            OR MINGW
+            OR CYGWIN)
+    endif(ZLIBBLAST_BUILD_TESTING)
+endif(ZLIBBLAST_BUILD_SHARED)
+
+if(ZLIBBLAST_BUILD_STATIC)
+    add_library(blastStatic STATIC
+                blast.c
+                blast.h)
+
+    set_target_properties(blastStatic
+        PROPERTIES
+            OUTPUT_NAME blast${minizip_static_suffix})
+
+    if(ZLIBBLAST_BUILD_TESTING)
+        enable_testing()
+        add_executable(blast-testStatic blast-test.c)
+        target_link_libraries(blast-testStatic blastStatic)
+
+        add_test(NAME blast_testStatic
+            COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_SOURCE_DIR}/tester.cmake
+                    "$<TARGET_FILE:blast-testStatic>"
+                    "${CMAKE_CURRENT_SOURCE_DIR}"
+                    "${CMAKE_CURRENT_BINARY_DIR}")
+    endif(ZLIBBLAST_BUILD_TESTING)
+endif(ZLIBBLAST_BUILD_STATIC)
diff --git a/contrib/blast/Makefile b/contrib/blast/Makefile
index 9be80ba..f64848b 100644
--- a/contrib/blast/Makefile
+++ b/contrib/blast/Makefile
@@ -1,8 +1,14 @@
-blast: blast.c blast.h
-	cc -DTEST -o blast blast.c
+all: test

-test: blast
-	blast < test.pk | cmp - test.txt
+libblast.so: blast.c blast.h
+	cc -o libblast.so -shared blast.c
+
+blast-test: libblast.so
+	cc -o blast-test.o -c blast-test.c
+	cc -o blast-test blast-test.o libblast.so
+
+test: blast-test
+	LD_LIBRARY_PATH=./ ./blast-test < test.pk | cmp - test.txt

 clean:
-	rm -f blast blast.o
+	rm -f libblast.so blast-test blast-test.o
diff --git a/contrib/blast/blast-test.c b/contrib/blast/blast-test.c
new file mode 100644
index 0000000..471dfd6
--- /dev/null
+++ b/contrib/blast/blast-test.c
@@ -0,0 +1,42 @@
+#include "blast.h"              /* prototype for blast() */
+
+/* Example of how to use blast() */
+#include <stdio.h>
+#include <stdlib.h>
+
+#define CHUNK 16384
+
+local unsigned inf(void *how, unsigned char **buf)
+{
+    static unsigned char hold[CHUNK];
+
+    *buf = hold;
+    return fread(hold, 1, CHUNK, (FILE *)how);
+}
+
+local int outf(void *how, unsigned char *buf, unsigned len)
+{
+    return fwrite(buf, 1, len, (FILE *)how) != len;
+}
+
+/* Decompress a PKWare Compression Library stream from stdin to stdout */
+int main(void)
+{
+    int ret;
+    unsigned left;
+
+    /* decompress to stdout */
+    left = 0;
+    ret = blast(inf, stdin, outf, stdout, &left, NULL);
+    if (ret != 0)
+        fprintf(stderr, "blast error: %d\n", ret);
+
+    /* count any leftover bytes */
+    while (getchar() != EOF)
+        left++;
+    if (left)
+        fprintf(stderr, "blast warning: %u unused bytes of input\n", left);
+
+    /* return blast() error code */
+    return ret;
+}
diff --git a/contrib/blast/blast.c b/contrib/blast/blast.c
index e6e6590..3f6963f 100644
--- a/contrib/blast/blast.c
+++ b/contrib/blast/blast.c
@@ -33,7 +33,6 @@
 #include <setjmp.h>             /* for setjmp(), longjmp(), and jmp_buf */
 #include "blast.h"              /* prototype for blast() */

-#define local static            /* for local function definitions */
 #define MAXBITS 13              /* maximum code length */
 #define MAXWIN 4096             /* maximum window size */

@@ -421,46 +420,3 @@ int blast(blast_in infun, void *inhow, blast_out outfun, void *outhow,
         err = 1;
     return err;
 }
-
-#ifdef TEST
-/* Example of how to use blast() */
-#include <stdio.h>
-#include <stdlib.h>
-
-#define CHUNK 16384
-
-local unsigned inf(void *how, unsigned char **buf)
-{
-    static unsigned char hold[CHUNK];
-
-    *buf = hold;
-    return fread(hold, 1, CHUNK, (FILE *)how);
-}
-
-local int outf(void *how, unsigned char *buf, unsigned len)
-{
-    return fwrite(buf, 1, len, (FILE *)how) != len;
-}
-
-/* Decompress a PKWare Compression Library stream from stdin to stdout */
-int main(void)
-{
-    int ret;
-    unsigned left;
-
-    /* decompress to stdout */
-    left = 0;
-    ret = blast(inf, stdin, outf, stdout, &left, NULL);
-    if (ret != 0)
-        fprintf(stderr, "blast error: %d\n", ret);
-
-    /* count any leftover bytes */
-    while (getchar() != EOF)
-        left++;
-    if (left)
-        fprintf(stderr, "blast warning: %u unused bytes of input\n", left);
-
-    /* return blast() error code */
-    return ret;
-}
-#endif
diff --git a/contrib/blast/blast.h b/contrib/blast/blast.h
index ef8544c..c5ef7ab 100644
--- a/contrib/blast/blast.h
+++ b/contrib/blast/blast.h
@@ -21,6 +21,7 @@
   Mark Adler    madler@alumni.caltech.edu
  */

+#define local static            /* for local function definitions */

 /*
  * blast() decompresses the PKWare Data Compression Library (DCL) compressed
diff --git a/contrib/blast/tester.cmake b/contrib/blast/tester.cmake
new file mode 100644
index 0000000..14e69fc
--- /dev/null
+++ b/contrib/blast/tester.cmake
@@ -0,0 +1,28 @@
+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:blast-test>"
+#CMAKE_ARGV4 = "${CMAKE_CURRENT_SOURCE_DIR}"
+#CMAKE_ARGV5 = "${CMAKE_CURRENT_BINARY_DIR}")
+
+execute_process(COMMAND ${CMAKE_ARGV3}
+                INPUT_FILE "${CMAKE_ARGV4}/test.pk"
+                OUTPUT_FILE "${CMAKE_ARGV5}/output.txt"
+                RESULT_VARIABLE RESULT)
+
+if(RESULT)
+    message(FATAL_ERROR "Command exitited with: ${RESULT}")
+endif(RESULT)
+
+execute_process(COMMAND ${CMAKE_ARGV0} -E compare_files
+                        "${CMAKE_ARGV4}/test.txt"
+                        "${CMAKE_ARGV5}/output.txt"
+                RESULT_VARIABLE RESULT)
+
+file(REMOVE "${CMAKE_ARGV5}/output.txt")
+
+if(RESULT)
+    message(FATAL_ERROR "Files differ")
+endif(RESULT)