aboutsummaryrefslogtreecommitdiff
path: root/compat
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2025-02-06 14:56:45 -0800
committerJunio C Hamano <gitster@pobox.com>2025-02-06 14:56:45 -0800
commit9d0e81e2ae3bd7f6d8a655be53c2396d7af3d2b0 (patch)
tree54481fadf7f95c85d003db2a4b591ce51cb266d5 /compat
parent9fad473faed7862855ced123de81a53fa27187d9 (diff)
parent78cdeed4c79d165c915e8de0355cc3fb7f5797c5 (diff)
downloadgit-9d0e81e2ae3bd7f6d8a655be53c2396d7af3d2b0.tar.xz
Merge branch 'ps/zlib-ng'
The code paths to interact with zlib has been cleaned up in preparation for building with zlib-ng. * ps/zlib-ng: ci: make "linux-musl" job use zlib-ng ci: switch linux-musl to use Meson compat/zlib: allow use of zlib-ng as backend git-zlib: cast away potential constness of `next_in` pointer compat/zlib: provide stubs for `deflateSetHeader()` compat/zlib: provide `deflateBound()` shim centrally git-compat-util: move include of "compat/zlib.h" into "git-zlib.h" compat: introduce new "zlib.h" header git-compat-util: drop `z_const` define compat: drop `uncompress2()` compatibility shim
Diffstat (limited to 'compat')
-rw-r--r--compat/zlib-compat.h53
-rw-r--r--compat/zlib-uncompress2.c96
2 files changed, 53 insertions, 96 deletions
diff --git a/compat/zlib-compat.h b/compat/zlib-compat.h
new file mode 100644
index 0000000000..0c60e3af33
--- /dev/null
+++ b/compat/zlib-compat.h
@@ -0,0 +1,53 @@
+#ifndef COMPAT_ZLIB_H
+#define COMPAT_ZLIB_H
+
+#ifdef HAVE_ZLIB_NG
+# include <zlib-ng.h>
+
+# define z_stream zng_stream
+#define gz_header_s zng_gz_header_s
+
+# define crc32(crc, buf, len) zng_crc32(crc, buf, len)
+
+# define inflate(strm, bits) zng_inflate(strm, bits)
+# define inflateEnd(strm) zng_inflateEnd(strm)
+# define inflateInit(strm) zng_inflateInit(strm)
+# define inflateInit2(strm, bits) zng_inflateInit2(strm, bits)
+# define inflateReset(strm) zng_inflateReset(strm)
+
+# define deflate(strm, flush) zng_deflate(strm, flush)
+# define deflateBound(strm, source_len) zng_deflateBound(strm, source_len)
+# define deflateEnd(strm) zng_deflateEnd(strm)
+# define deflateInit(strm, level) zng_deflateInit(strm, level)
+# define deflateInit2(stream, level, method, window_bits, mem_level, strategy) zng_deflateInit2(stream, level, method, window_bits, mem_level, strategy)
+# define deflateReset(strm) zng_deflateReset(strm)
+# define deflateSetHeader(strm, head) zng_deflateSetHeader(strm, head)
+
+#else
+# include <zlib.h>
+
+# if defined(NO_DEFLATE_BOUND) || ZLIB_VERNUM < 0x1200
+# define deflateBound(c,s) ((s) + (((s) + 7) >> 3) + (((s) + 63) >> 6) + 11)
+# endif
+
+/*
+ * zlib only gained support for setting up the gzip header in v1.2.2.1. In
+ * Git we only set the header to make archives reproducible across different
+ * operating systems, so it's fine to simply make this a no-op when using a
+ * zlib version that doesn't support this yet.
+ */
+# if ZLIB_VERNUM < 0x1221
+struct gz_header_s {
+ int os;
+};
+
+static int deflateSetHeader(z_streamp strm, struct gz_header_s *head)
+{
+ (void)(strm);
+ (void)(head);
+ return Z_OK;
+}
+# endif
+#endif /* HAVE_ZLIB_NG */
+
+#endif /* COMPAT_ZLIB_H */
diff --git a/compat/zlib-uncompress2.c b/compat/zlib-uncompress2.c
deleted file mode 100644
index 77a1b08048..0000000000
--- a/compat/zlib-uncompress2.c
+++ /dev/null
@@ -1,96 +0,0 @@
-#include "git-compat-util.h"
-
-#if ZLIB_VERNUM < 0x1290
-/* taken from zlib's uncompr.c
-
- commit cacf7f1d4e3d44d871b605da3b647f07d718623f
- Author: Mark Adler <madler@alumni.caltech.edu>
- Date: Sun Jan 15 09:18:46 2017 -0800
-
- zlib 1.2.11
-
-*/
-
-/*
- * Copyright (C) 1995-2003, 2010, 2014, 2016 Jean-loup Gailly, Mark Adler
- * For conditions of distribution and use, see copyright notice in zlib.h
- */
-
-/* clang-format off */
-
-/* ===========================================================================
- Decompresses the source buffer into the destination buffer. *sourceLen is
- the byte length of the source buffer. Upon entry, *destLen is the total size
- of the destination buffer, which must be large enough to hold the entire
- uncompressed data. (The size of the uncompressed data must have been saved
- previously by the compressor and transmitted to the decompressor by some
- mechanism outside the scope of this compression library.) Upon exit,
- *destLen is the size of the decompressed data and *sourceLen is the number
- of source bytes consumed. Upon return, source + *sourceLen points to the
- first unused input byte.
-
- uncompress returns Z_OK if success, Z_MEM_ERROR if there was not enough
- memory, Z_BUF_ERROR if there was not enough room in the output buffer, or
- Z_DATA_ERROR if the input data was corrupted, including if the input data is
- an incomplete zlib stream.
-*/
-int ZEXPORT uncompress2 (
- Bytef *dest,
- uLongf *destLen,
- const Bytef *source,
- uLong *sourceLen) {
- z_stream stream;
- int err;
- const uInt max = (uInt)-1;
- uLong len, left;
- Byte buf[1]; /* for detection of incomplete stream when *destLen == 0 */
-
- len = *sourceLen;
- if (*destLen) {
- left = *destLen;
- *destLen = 0;
- }
- else {
- left = 1;
- dest = buf;
- }
-
- stream.next_in = (z_const Bytef *)source;
- stream.avail_in = 0;
- stream.zalloc = (alloc_func)0;
- stream.zfree = (free_func)0;
- stream.opaque = (voidpf)0;
-
- err = inflateInit(&stream);
- if (err != Z_OK) return err;
-
- stream.next_out = dest;
- stream.avail_out = 0;
-
- do {
- if (stream.avail_out == 0) {
- stream.avail_out = left > (uLong)max ? max : (uInt)left;
- left -= stream.avail_out;
- }
- if (stream.avail_in == 0) {
- stream.avail_in = len > (uLong)max ? max : (uInt)len;
- len -= stream.avail_in;
- }
- err = inflate(&stream, Z_NO_FLUSH);
- } while (err == Z_OK);
-
- *sourceLen -= len + stream.avail_in;
- if (dest != buf)
- *destLen = stream.total_out;
- else if (stream.total_out && err == Z_BUF_ERROR)
- left = 1;
-
- inflateEnd(&stream);
- return err == Z_STREAM_END ? Z_OK :
- err == Z_NEED_DICT ? Z_DATA_ERROR :
- err == Z_BUF_ERROR && left + stream.avail_out ? Z_DATA_ERROR :
- err;
-}
-#else
-static void *dummy_variable = &dummy_variable;
-#endif