]> git.ipfire.org Git - thirdparty/zlib-ng.git/commitdiff
Make the existence of gz_intmax() unconditional.
authorMilan Bulat <milan@peer.inc>
Mon, 29 Jan 2024 03:43:23 +0000 (19:43 -0800)
committerHans Kristian Rosbach <hk-github@circlestorm.org>
Wed, 7 Feb 2024 18:15:56 +0000 (19:15 +0100)
gz_intmax() is noted in zlib.map. This assures it's always there.

madler/zlib#01253ecd7e0a01d311670f2d03c61b82fc12d338

gzguts.h
gzlib.c

index a663844b693efa9626d4fb7318635433a6fee5db..dc0ebeb2a253bc4bf356bee3e3d4c53b0674d8fc 100644 (file)
--- a/gzguts.h
+++ b/gzguts.h
@@ -139,6 +139,7 @@ void Z_INTERNAL gz_error(gz_state *, int, const char *);
 /* GT_OFF(x), where x is an unsigned value, is true if x > maximum z_off64_t
    value -- needed when comparing unsigned to z_off64_t, which is signed
    (possible z_off64_t types off_t, off64_t, and long are all signed) */
+unsigned Z_INTERNAL gz_intmax(void);
 #define GT_OFF(x) (sizeof(int) == sizeof(z_off64_t) && (x) > INT_MAX)
 
 #endif /* GZGUTS_H_ */
diff --git a/gzlib.c b/gzlib.c
index e613837efb52ecad7e13eda4eb6d8c49ac7cafc6..8c7a1dc0b5caf55114f81c954b5ed952df6274d0 100644 (file)
--- a/gzlib.c
+++ b/gzlib.c
@@ -523,3 +523,21 @@ void Z_INTERNAL gz_error(gz_state *state, int err, const char *msg) {
     }
     (void)snprintf(state->msg, strlen(state->path) + strlen(msg) + 3, "%s%s%s", state->path, ": ", msg);
 }
+
+/* portably return maximum value for an int (when limits.h presumed not
+   available) -- we need to do this to cover cases where 2's complement not
+   used, since C standard permits 1's complement and sign-bit representations,
+   otherwise we could just use ((unsigned)-1) >> 1 */
+unsigned Z_INTERNAL gz_intmax(void) {
+#ifdef INT_MAX
+    return INT_MAX;
+#else
+    unsigned p = 1, q;
+    do {
+        q = p;
+        p <<= 1;
+        p++;
+    } while (p > q);
+    return q >> 1;
+#endif
+}