zlib-clib 1.3.1 → 1.3.2
raw patch · 21 files changed
+971/−751 lines, 21 files
Files
- LICENSE +1/−1
- cbits/compress.c +34/−10
- cbits/crc32.c +49/−115
- cbits/deflate.c +111/−65
- cbits/deflate.h +7/−1
- cbits/gzguts.h +33/−31
- cbits/infback.c +20/−67
- cbits/inffast.c +7/−6
- cbits/inffixed.h +91/−91
- cbits/inflate.c +38/−151
- cbits/inflate.h +1/−1
- cbits/inftrees.c +134/−9
- cbits/inftrees.h +3/−1
- cbits/trees.c +15/−13
- cbits/uncompr.c +39/−23
- cbits/zconf.h +27/−19
- cbits/zlib.h +213/−94
- cbits/zutil.c +49/−35
- cbits/zutil.h +88/−11
- changelog.md +4/−0
- zlib-clib.cabal +7/−7
LICENSE view
@@ -1,6 +1,6 @@ Copyright notice: - (C) 1995-2024 Jean-loup Gailly and Mark Adler+ (C) 1995-2026 Jean-loup Gailly and Mark Adler This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages
cbits/compress.c view
@@ -1,5 +1,5 @@ /* compress.c -- compress a memory buffer- * Copyright (C) 1995-2005, 2014, 2016 Jean-loup Gailly, Mark Adler+ * Copyright (C) 1995-2026 Jean-loup Gailly, Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -18,14 +18,20 @@ compress2 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, Z_STREAM_ERROR if the level parameter is invalid.++ The _z versions of the functions take size_t length arguments. */-int ZEXPORT compress2(Bytef *dest, uLongf *destLen, const Bytef *source,- uLong sourceLen, int level) {+int ZEXPORT compress2_z(Bytef *dest, z_size_t *destLen, const Bytef *source,+ z_size_t sourceLen, int level) { z_stream stream; int err; const uInt max = (uInt)-1;- uLong left;+ z_size_t left; + if ((sourceLen > 0 && source == NULL) ||+ destLen == NULL || (*destLen > 0 && dest == NULL))+ return Z_STREAM_ERROR;+ left = *destLen; *destLen = 0; @@ -43,23 +49,36 @@ do { if (stream.avail_out == 0) {- stream.avail_out = left > (uLong)max ? max : (uInt)left;+ stream.avail_out = left > (z_size_t)max ? max : (uInt)left; left -= stream.avail_out; } if (stream.avail_in == 0) {- stream.avail_in = sourceLen > (uLong)max ? max : (uInt)sourceLen;+ stream.avail_in = sourceLen > (z_size_t)max ? max :+ (uInt)sourceLen; sourceLen -= stream.avail_in; } err = deflate(&stream, sourceLen ? Z_NO_FLUSH : Z_FINISH); } while (err == Z_OK); - *destLen = stream.total_out;+ *destLen = (z_size_t)(stream.next_out - dest); deflateEnd(&stream); return err == Z_STREAM_END ? Z_OK : err; }-+int ZEXPORT compress2(Bytef *dest, uLongf *destLen, const Bytef *source,+ uLong sourceLen, int level) {+ int ret;+ z_size_t got = *destLen;+ ret = compress2_z(dest, &got, source, sourceLen, level);+ *destLen = (uLong)got;+ return ret;+} /* =========================================================================== */+int ZEXPORT compress_z(Bytef *dest, z_size_t *destLen, const Bytef *source,+ z_size_t sourceLen) {+ return compress2_z(dest, destLen, source, sourceLen,+ Z_DEFAULT_COMPRESSION);+} int ZEXPORT compress(Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen) { return compress2(dest, destLen, source, sourceLen, Z_DEFAULT_COMPRESSION);@@ -69,7 +88,12 @@ If the default memLevel or windowBits for deflateInit() is changed, then this function needs to be updated. */+z_size_t ZEXPORT compressBound_z(z_size_t sourceLen) {+ z_size_t bound = sourceLen + (sourceLen >> 12) + (sourceLen >> 14) ++ (sourceLen >> 25) + 13;+ return bound < sourceLen ? (z_size_t)-1 : bound;+} uLong ZEXPORT compressBound(uLong sourceLen) {- return sourceLen + (sourceLen >> 12) + (sourceLen >> 14) +- (sourceLen >> 25) + 13;+ z_size_t bound = compressBound_z(sourceLen);+ return (uLong)bound != bound ? (uLong)-1 : (uLong)bound; }
cbits/crc32.c view
@@ -1,5 +1,5 @@ /* crc32.c -- compute the CRC-32 of a data stream- * Copyright (C) 1995-2022 Mark Adler+ * Copyright (C) 1995-2026 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h * * This interleaved implementation of a CRC makes use of pipelined multiple@@ -24,11 +24,18 @@ # include <stdio.h> # ifndef DYNAMIC_CRC_TABLE # define DYNAMIC_CRC_TABLE-# endif /* !DYNAMIC_CRC_TABLE */-#endif /* MAKECRCH */+# endif+#endif+#ifdef DYNAMIC_CRC_TABLE+# define Z_ONCE+#endif #include "zutil.h" /* for Z_U4, Z_U8, z_crc_t, and FAR definitions */ +#ifdef HAVE_S390X_VX+# include "contrib/crc32vx/crc32_vx_hooks.h"+#endif+ /* A CRC of a message is computed on N braids of words in the message, where each word consists of W bytes (4 or 8). If N is 3, for example, then three@@ -99,7 +106,8 @@ #endif /* If available, use the ARM processor CRC32 instruction. */-#if defined(__aarch64__) && defined(__ARM_FEATURE_CRC32) && W == 8+#if defined(__aarch64__) && defined(__ARM_FEATURE_CRC32) && \+ defined(W) && W == 8 # define ARMCRC32 #endif @@ -152,10 +160,10 @@ Return a(x) multiplied by b(x) modulo p(x), where p(x) is the CRC polynomial, reflected. For speed, this requires that a not be zero. */-local z_crc_t multmodp(z_crc_t a, z_crc_t b) {- z_crc_t m, p;+local uLong multmodp(uLong a, uLong b) {+ uLong m, p; - m = (z_crc_t)1 << 31;+ m = (uLong)1 << 31; p = 0; for (;;) { if (a & m) {@@ -171,12 +179,12 @@ /* Return x^(n * 2^k) modulo p(x). Requires that x2n_table[] has been- initialized.+ initialized. n must not be negative. */-local z_crc_t x2nmodp(z_off64_t n, unsigned k) {- z_crc_t p;+local uLong x2nmodp(z_off64_t n, unsigned k) {+ uLong p; - p = (z_crc_t)1 << 31; /* x^0 == 1 */+ p = (uLong)1 << 31; /* x^0 == 1 */ while (n) { if (n & 1) p = multmodp(x2n_table[k & 31], p);@@ -204,83 +212,8 @@ local void write_table64(FILE *, const z_word_t FAR *, int); #endif /* MAKECRCH */ -/*- Define a once() function depending on the availability of atomics. If this is- compiled with DYNAMIC_CRC_TABLE defined, and if CRCs will be computed in- multiple threads, and if atomics are not available, then get_crc_table() must- be called to initialize the tables and must return before any threads are- allowed to compute or combine CRCs.- */--/* Definition of once functionality. */-typedef struct once_s once_t;--/* Check for the availability of atomics. */-#if defined(__STDC__) && __STDC_VERSION__ >= 201112L && \- !defined(__STDC_NO_ATOMICS__)--#include <stdatomic.h>--/* Structure for once(), which must be initialized with ONCE_INIT. */-struct once_s {- atomic_flag begun;- atomic_int done;-};-#define ONCE_INIT {ATOMIC_FLAG_INIT, 0}--/*- Run the provided init() function exactly once, even if multiple threads- invoke once() at the same time. The state must be a once_t initialized with- ONCE_INIT.- */-local void once(once_t *state, void (*init)(void)) {- if (!atomic_load(&state->done)) {- if (atomic_flag_test_and_set(&state->begun))- while (!atomic_load(&state->done))- ;- else {- init();- atomic_store(&state->done, 1);- }- }-}--#else /* no atomics */--/* Structure for once(), which must be initialized with ONCE_INIT. */-struct once_s {- volatile int begun;- volatile int done;-};-#define ONCE_INIT {0, 0}--/* Test and set. Alas, not atomic, but tries to minimize the period of- vulnerability. */-local int test_and_set(int volatile *flag) {- int was;-- was = *flag;- *flag = 1;- return was;-}--/* Run the provided init() function once. This is not thread-safe. */-local void once(once_t *state, void (*init)(void)) {- if (!state->done) {- if (test_and_set(&state->begun))- while (!state->done)- ;- else {- init();- state->done = 1;- }- }-}--#endif- /* State for once(). */-local once_t made = ONCE_INIT;+local z_once_t made = Z_ONCE_INIT; /* Generate tables for a byte-wise 32-bit CRC calculation on the polynomial:@@ -326,7 +259,7 @@ p = (z_crc_t)1 << 30; /* x^1 */ x2n_table[0] = p; for (n = 1; n < 32; n++)- x2n_table[n] = p = multmodp(p, p);+ x2n_table[n] = p = (z_crc_t)multmodp(p, p); #ifdef W /* initialize the braiding tables -- needs x2n_table[] */@@ -529,11 +462,11 @@ int k; z_crc_t i, p, q; for (k = 0; k < w; k++) {- p = x2nmodp((n * w + 3 - k) << 3, 0);+ p = (z_crc_t)x2nmodp((n * w + 3 - k) << 3, 0); ltl[k][0] = 0; big[w - 1 - k][0] = 0; for (i = 1; i < 256; i++) {- ltl[k][i] = q = multmodp(i << 24, p);+ ltl[k][i] = q = (z_crc_t)multmodp(i << 24, p); big[w - 1 - k][i] = byte_swap(q); } }@@ -548,7 +481,7 @@ */ const z_crc_t FAR * ZEXPORT get_crc_table(void) { #ifdef DYNAMIC_CRC_TABLE- once(&made, make_crc_table);+ z_once(&made, make_crc_table); #endif /* DYNAMIC_CRC_TABLE */ return (const z_crc_t FAR *)crc_table; }@@ -572,9 +505,8 @@ #define Z_BATCH_ZEROS 0xa10d3d0c /* computed from Z_BATCH = 3990 */ #define Z_BATCH_MIN 800 /* fewest words in a final batch */ -unsigned long ZEXPORT crc32_z(unsigned long crc, const unsigned char FAR *buf,- z_size_t len) {- z_crc_t val;+uLong ZEXPORT crc32_z(uLong crc, const unsigned char FAR *buf, z_size_t len) {+ uLong val; z_word_t crc1, crc2; const z_word_t *word; z_word_t val0, val1, val2;@@ -585,7 +517,7 @@ if (buf == Z_NULL) return 0; #ifdef DYNAMIC_CRC_TABLE- once(&made, make_crc_table);+ z_once(&made, make_crc_table); #endif /* DYNAMIC_CRC_TABLE */ /* Pre-condition the CRC */@@ -640,7 +572,7 @@ } word += 3 * last; num -= 3 * last;- val = x2nmodp(last, 6);+ val = x2nmodp((int)last, 6); crc = multmodp(val, crc) ^ crc1; crc = multmodp(val, crc) ^ crc2; }@@ -691,13 +623,12 @@ #endif /* ========================================================================= */-unsigned long ZEXPORT crc32_z(unsigned long crc, const unsigned char FAR *buf,- z_size_t len) {+uLong ZEXPORT crc32_z(uLong crc, const unsigned char FAR *buf, z_size_t len) { /* Return initial CRC, if requested. */ if (buf == Z_NULL) return 0; #ifdef DYNAMIC_CRC_TABLE- once(&made, make_crc_table);+ z_once(&made, make_crc_table); #endif /* DYNAMIC_CRC_TABLE */ /* Pre-condition the CRC */@@ -1012,38 +943,41 @@ #endif /* ========================================================================= */-unsigned long ZEXPORT crc32(unsigned long crc, const unsigned char FAR *buf,- uInt len) {+uLong ZEXPORT crc32(uLong crc, const unsigned char FAR *buf, uInt len) {+ #ifdef HAVE_S390X_VX+ return crc32_z_hook(crc, buf, len);+ #endif return crc32_z(crc, buf, len); } /* ========================================================================= */-uLong ZEXPORT crc32_combine64(uLong crc1, uLong crc2, z_off64_t len2) {+uLong ZEXPORT crc32_combine_gen64(z_off64_t len2) {+ if (len2 < 0)+ return 0; #ifdef DYNAMIC_CRC_TABLE- once(&made, make_crc_table);+ z_once(&made, make_crc_table); #endif /* DYNAMIC_CRC_TABLE */- return multmodp(x2nmodp(len2, 3), crc1) ^ (crc2 & 0xffffffff);+ return x2nmodp(len2, 3); } /* ========================================================================= */-uLong ZEXPORT crc32_combine(uLong crc1, uLong crc2, z_off_t len2) {- return crc32_combine64(crc1, crc2, (z_off64_t)len2);+uLong ZEXPORT crc32_combine_gen(z_off_t len2) {+ return crc32_combine_gen64((z_off64_t)len2); } /* ========================================================================= */-uLong ZEXPORT crc32_combine_gen64(z_off64_t len2) {-#ifdef DYNAMIC_CRC_TABLE- once(&made, make_crc_table);-#endif /* DYNAMIC_CRC_TABLE */- return x2nmodp(len2, 3);+uLong ZEXPORT crc32_combine_op(uLong crc1, uLong crc2, uLong op) {+ if (op == 0)+ return 0;+ return multmodp(op, crc1 & 0xffffffff) ^ (crc2 & 0xffffffff); } /* ========================================================================= */-uLong ZEXPORT crc32_combine_gen(z_off_t len2) {- return crc32_combine_gen64((z_off64_t)len2);+uLong ZEXPORT crc32_combine64(uLong crc1, uLong crc2, z_off64_t len2) {+ return crc32_combine_op(crc1, crc2, crc32_combine_gen64(len2)); } /* ========================================================================= */-uLong ZEXPORT crc32_combine_op(uLong crc1, uLong crc2, uLong op) {- return multmodp(op, crc1) ^ (crc2 & 0xffffffff);+uLong ZEXPORT crc32_combine(uLong crc1, uLong crc2, z_off_t len2) {+ return crc32_combine64(crc1, crc2, (z_off64_t)len2); }
cbits/deflate.c view
@@ -1,5 +1,5 @@ /* deflate.c -- compress data using the deflation algorithm- * Copyright (C) 1995-2024 Jean-loup Gailly and Mark Adler+ * Copyright (C) 1995-2026 Jean-loup Gailly and Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -37,7 +37,7 @@ * REFERENCES * * Deutsch, L.P.,"DEFLATE Compressed Data Format Specification".- * Available in http://tools.ietf.org/html/rfc1951+ * Available at https://datatracker.ietf.org/doc/html/rfc1951 * * A description of the Rabin and Karp algorithm is given in the book * "Algorithms" by R. Sedgewick, Addison-Wesley, p252.@@ -52,7 +52,7 @@ #include "deflate.h" const char deflate_copyright[] =- " deflate 1.3.1 Copyright 1995-2024 Jean-loup Gailly and Mark Adler ";+ " deflate 1.3.2 Copyright 1995-2026 Jean-loup Gailly and Mark Adler "; /* If you use the zlib library in a product, an acknowledgment is welcome in the documentation of your product. If for some reason you cannot@@ -170,8 +170,8 @@ #define CLEAR_HASH(s) \ do { \ s->head[s->hash_size - 1] = NIL; \- zmemzero((Bytef *)s->head, \- (unsigned)(s->hash_size - 1)*sizeof(*s->head)); \+ zmemzero(s->head, (unsigned)(s->hash_size - 1)*sizeof(*s->head)); \+ s->slid = 0; \ } while (0) /* ===========================================================================@@ -195,8 +195,8 @@ m = *--p; *p = (Pos)(m >= wsize ? m - wsize : NIL); } while (--n);- n = wsize; #ifndef FASTEST+ n = wsize; p = &s->prev[n]; do { m = *--p;@@ -206,6 +206,7 @@ */ } while (--n); #endif+ s->slid = 1; } /* ===========================================================================@@ -259,7 +260,14 @@ more = (unsigned)(s->window_size -(ulg)s->lookahead -(ulg)s->strstart); /* Deal with !@#$% 64K limit: */+#ifdef _MSC_VER+#pragma warning(push)+#pragma warning(disable: 4127)+#endif if (sizeof(int) <= 2) {+#ifdef _MSC_VER+#pragma warning(pop)+#endif if (more == 0 && s->strstart == 0 && s->lookahead == 0) { more = wsize; @@ -431,6 +439,7 @@ if (windowBits == 8) windowBits = 9; /* until 256-byte window bug fixed */ s = (deflate_state *) ZALLOC(strm, 1, sizeof(deflate_state)); if (s == Z_NULL) return Z_MEM_ERROR;+ zmemzero(s, sizeof(deflate_state)); strm->state = (struct internal_state FAR *)s; s->strm = strm; s->status = INIT_STATE; /* to pass state test in deflateReset() */@@ -712,14 +721,27 @@ /* ========================================================================= */ int ZEXPORT deflatePending(z_streamp strm, unsigned *pending, int *bits) { if (deflateStateCheck(strm)) return Z_STREAM_ERROR;- if (pending != Z_NULL)- *pending = strm->state->pending; if (bits != Z_NULL) *bits = strm->state->bi_valid;+ if (pending != Z_NULL) {+ *pending = (unsigned)strm->state->pending;+ if (*pending != strm->state->pending) {+ *pending = (unsigned)-1;+ return Z_BUF_ERROR;+ }+ } return Z_OK; } /* ========================================================================= */+int ZEXPORT deflateUsed(z_streamp strm, int *bits) {+ if (deflateStateCheck(strm)) return Z_STREAM_ERROR;+ if (bits != Z_NULL)+ *bits = strm->state->bi_used;+ return Z_OK;+}++/* ========================================================================= */ int ZEXPORT deflatePrime(z_streamp strm, int bits, int value) { deflate_state *s; int put;@@ -831,28 +853,34 @@ * * Shifts are used to approximate divisions, for speed. */-uLong ZEXPORT deflateBound(z_streamp strm, uLong sourceLen) {+z_size_t ZEXPORT deflateBound_z(z_streamp strm, z_size_t sourceLen) { deflate_state *s;- uLong fixedlen, storelen, wraplen;+ z_size_t fixedlen, storelen, wraplen, bound; /* upper bound for fixed blocks with 9-bit literals and length 255 (memLevel == 2, which is the lowest that may not use stored blocks) -- ~13% overhead plus a small constant */ fixedlen = sourceLen + (sourceLen >> 3) + (sourceLen >> 8) + (sourceLen >> 9) + 4;+ if (fixedlen < sourceLen)+ fixedlen = (z_size_t)-1; /* upper bound for stored blocks with length 127 (memLevel == 1) -- ~4% overhead plus a small constant */ storelen = sourceLen + (sourceLen >> 5) + (sourceLen >> 7) + (sourceLen >> 11) + 7;+ if (storelen < sourceLen)+ storelen = (z_size_t)-1; - /* if can't get parameters, return larger bound plus a zlib wrapper */- if (deflateStateCheck(strm))- return (fixedlen > storelen ? fixedlen : storelen) + 6;+ /* if can't get parameters, return larger bound plus a wrapper */+ if (deflateStateCheck(strm)) {+ bound = fixedlen > storelen ? fixedlen : storelen;+ return bound + 18 < bound ? (z_size_t)-1 : bound + 18;+ } /* compute wrapper length */ s = strm->state;- switch (s->wrap) {+ switch (s->wrap < 0 ? -s->wrap : s->wrap) { case 0: /* raw deflate */ wraplen = 0; break;@@ -882,19 +910,26 @@ break; #endif default: /* for compiler happiness */- wraplen = 6;+ wraplen = 18; } /* if not default parameters, return one of the conservative bounds */- if (s->w_bits != 15 || s->hash_bits != 8 + 7)- return (s->w_bits <= s->hash_bits && s->level ? fixedlen : storelen) +- wraplen;+ if (s->w_bits != 15 || s->hash_bits != 8 + 7) {+ bound = s->w_bits <= s->hash_bits && s->level ? fixedlen :+ storelen;+ return bound + wraplen < bound ? (z_size_t)-1 : bound + wraplen;+ } /* default settings: return tight bound for that case -- ~0.03% overhead plus a small constant */- return sourceLen + (sourceLen >> 12) + (sourceLen >> 14) +- (sourceLen >> 25) + 13 - 6 + wraplen;+ bound = sourceLen + (sourceLen >> 12) + (sourceLen >> 14) ++ (sourceLen >> 25) + 13 - 6 + wraplen;+ return bound < sourceLen ? (z_size_t)-1 : bound; }+uLong ZEXPORT deflateBound(z_streamp strm, uLong sourceLen) {+ z_size_t bound = deflateBound_z(strm, sourceLen);+ return (uLong)bound != bound ? (uLong)-1 : (uLong)bound;+} /* ========================================================================= * Put a short in the pending buffer. The 16-bit value is put in MSB order.@@ -917,8 +952,8 @@ deflate_state *s = strm->state; _tr_flush_bits(s);- len = s->pending;- if (len > strm->avail_out) len = strm->avail_out;+ len = s->pending > strm->avail_out ? strm->avail_out :+ (unsigned)s->pending; if (len == 0) return; zmemcpy(strm->next_out, s->pending_out, len);@@ -938,8 +973,8 @@ #define HCRC_UPDATE(beg) \ do { \ if (s->gzhead->hcrc && s->pending > (beg)) \- strm->adler = crc32(strm->adler, s->pending_buf + (beg), \- s->pending - (beg)); \+ strm->adler = crc32_z(strm->adler, s->pending_buf + (beg), \+ s->pending - (beg)); \ } while (0) /* ========================================================================= */@@ -1073,8 +1108,8 @@ put_byte(s, (s->gzhead->extra_len >> 8) & 0xff); } if (s->gzhead->hcrc)- strm->adler = crc32(strm->adler, s->pending_buf,- s->pending);+ strm->adler = crc32_z(strm->adler, s->pending_buf,+ s->pending); s->gzindex = 0; s->status = EXTRA_STATE; }@@ -1082,9 +1117,9 @@ if (s->status == EXTRA_STATE) { if (s->gzhead->extra != Z_NULL) { ulg beg = s->pending; /* start of bytes to update crc */- uInt left = (s->gzhead->extra_len & 0xffff) - s->gzindex;+ ulg left = (s->gzhead->extra_len & 0xffff) - s->gzindex; while (s->pending + left > s->pending_buf_size) {- uInt copy = s->pending_buf_size - s->pending;+ ulg copy = s->pending_buf_size - s->pending; zmemcpy(s->pending_buf + s->pending, s->gzhead->extra + s->gzindex, copy); s->pending = s->pending_buf_size;@@ -1295,12 +1330,13 @@ ss = source->state; - zmemcpy((voidpf)dest, (voidpf)source, sizeof(z_stream));+ zmemcpy(dest, source, sizeof(z_stream)); ds = (deflate_state *) ZALLOC(dest, 1, sizeof(deflate_state)); if (ds == Z_NULL) return Z_MEM_ERROR;+ zmemzero(ds, sizeof(deflate_state)); dest->state = (struct internal_state FAR *) ds;- zmemcpy((voidpf)ds, (voidpf)ss, sizeof(deflate_state));+ zmemcpy(ds, ss, sizeof(deflate_state)); ds->strm = dest; ds->window = (Bytef *) ZALLOC(dest, ds->w_size, 2*sizeof(Byte));@@ -1313,18 +1349,23 @@ deflateEnd (dest); return Z_MEM_ERROR; }- /* following zmemcpy do not work for 16-bit MSDOS */- zmemcpy(ds->window, ss->window, ds->w_size * 2 * sizeof(Byte));- zmemcpy((voidpf)ds->prev, (voidpf)ss->prev, ds->w_size * sizeof(Pos));- zmemcpy((voidpf)ds->head, (voidpf)ss->head, ds->hash_size * sizeof(Pos));- zmemcpy(ds->pending_buf, ss->pending_buf, ds->lit_bufsize * LIT_BUFS);+ /* following zmemcpy's do not work for 16-bit MSDOS */+ zmemcpy(ds->window, ss->window, ss->high_water);+ zmemcpy(ds->prev, ss->prev,+ (ss->slid || ss->strstart - ss->insert > ds->w_size ? ds->w_size :+ ss->strstart - ss->insert) * sizeof(Pos));+ zmemcpy(ds->head, ss->head, ds->hash_size * sizeof(Pos)); ds->pending_out = ds->pending_buf + (ss->pending_out - ss->pending_buf);+ zmemcpy(ds->pending_out, ss->pending_out, ss->pending); #ifdef LIT_MEM ds->d_buf = (ushf *)(ds->pending_buf + (ds->lit_bufsize << 1)); ds->l_buf = ds->pending_buf + (ds->lit_bufsize << 2);+ zmemcpy(ds->d_buf, ss->d_buf, ss->sym_next * sizeof(ush));+ zmemcpy(ds->l_buf, ss->l_buf, ss->sym_next); #else ds->sym_buf = ds->pending_buf + ds->lit_bufsize;+ zmemcpy(ds->sym_buf, ss->sym_buf, ss->sym_next); #endif ds->l_desc.dyn_tree = ds->dyn_ltree;@@ -1347,9 +1388,9 @@ */ local uInt longest_match(deflate_state *s, IPos cur_match) { unsigned chain_length = s->max_chain_length;/* max hash chain length */- register Bytef *scan = s->window + s->strstart; /* current string */- register Bytef *match; /* matched string */- register int len; /* length of current match */+ Bytef *scan = s->window + s->strstart; /* current string */+ Bytef *match; /* matched string */+ int len; /* length of current match */ int best_len = (int)s->prev_length; /* best match length so far */ int nice_match = s->nice_match; /* stop if match long enough */ IPos limit = s->strstart > (IPos)MAX_DIST(s) ?@@ -1364,13 +1405,13 @@ /* Compare two bytes at a time. Note: this is not always beneficial. * Try with and without -DUNALIGNED_OK to check. */- register Bytef *strend = s->window + s->strstart + MAX_MATCH - 1;- register ush scan_start = *(ushf*)scan;- register ush scan_end = *(ushf*)(scan + best_len - 1);+ Bytef *strend = s->window + s->strstart + MAX_MATCH - 1;+ ush scan_start = *(ushf*)scan;+ ush scan_end = *(ushf*)(scan + best_len - 1); #else- register Bytef *strend = s->window + s->strstart + MAX_MATCH;- register Byte scan_end1 = scan[best_len - 1];- register Byte scan_end = scan[best_len];+ Bytef *strend = s->window + s->strstart + MAX_MATCH;+ Byte scan_end1 = scan[best_len - 1];+ Byte scan_end = scan[best_len]; #endif /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16.@@ -1494,10 +1535,10 @@ * Optimized version for FASTEST only */ local uInt longest_match(deflate_state *s, IPos cur_match) {- register Bytef *scan = s->window + s->strstart; /* current string */- register Bytef *match; /* matched string */- register int len; /* length of current match */- register Bytef *strend = s->window + s->strstart + MAX_MATCH;+ Bytef *scan = s->window + s->strstart; /* current string */+ Bytef *match; /* matched string */+ int len; /* length of current match */+ Bytef *strend = s->window + s->strstart + MAX_MATCH; /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16. * It is easy to get rid of this optimization if necessary.@@ -1557,7 +1598,7 @@ local void check_match(deflate_state *s, IPos start, IPos match, int length) { /* check that the match is indeed a match */ Bytef *back = s->window + (int)match, *here = s->window + start;- IPos len = length;+ IPos len = (IPos)length; if (match == (IPos)-1) { /* match starts one byte before the current window -- just compare the subsequent length-1 bytes */@@ -1629,13 +1670,14 @@ * this is 32K. This can be as small as 507 bytes for memLevel == 1. For * large input and output buffers, the stored block size will be larger. */- unsigned min_block = MIN(s->pending_buf_size - 5, s->w_size);+ unsigned min_block = (unsigned)(MIN(s->pending_buf_size - 5, s->w_size)); /* Copy as many min_block or larger stored blocks directly to next_out as * possible. If flushing, copy the remaining available input to next_out as * stored blocks, if there is enough space. */- unsigned len, left, have, last = 0;+ int last = 0;+ unsigned len, left, have; unsigned used = s->strm->avail_in; do { /* Set len to the maximum size block that we can copy directly with the@@ -1643,12 +1685,12 @@ * would be copied from what's left in the window. */ len = MAX_STORED; /* maximum deflate stored block length */- have = (s->bi_valid + 42) >> 3; /* number of header bytes */+ have = ((unsigned)s->bi_valid + 42) >> 3; /* bytes in header */ if (s->strm->avail_out < have) /* need room for header */ break; /* maximum stored block length that will fit in avail_out: */ have = s->strm->avail_out - have;- left = s->strstart - s->block_start; /* bytes left in window */+ left = (unsigned)(s->strstart - s->block_start); /* window bytes */ if (len > (ulg)left + s->strm->avail_in) len = left + s->strm->avail_in; /* limit len to the input */ if (len > have)@@ -1671,10 +1713,10 @@ _tr_stored_block(s, (char *)0, 0L, last); /* Replace the lengths in the dummy stored block with len. */- s->pending_buf[s->pending - 4] = len;- s->pending_buf[s->pending - 3] = len >> 8;- s->pending_buf[s->pending - 2] = ~len;- s->pending_buf[s->pending - 1] = ~len >> 8;+ s->pending_buf[s->pending - 4] = (Bytef)len;+ s->pending_buf[s->pending - 3] = (Bytef)(len >> 8);+ s->pending_buf[s->pending - 2] = (Bytef)~len;+ s->pending_buf[s->pending - 1] = (Bytef)(~len >> 8); /* Write the stored block header bytes. */ flush_pending(s->strm);@@ -1745,8 +1787,10 @@ s->high_water = s->strstart; /* If the last block was written to next_out, then done. */- if (last)+ if (last) {+ s->bi_used = 8; return finish_done;+ } /* If flushing and all input has been consumed, then done. */ if (flush != Z_NO_FLUSH && flush != Z_FINISH &&@@ -1754,7 +1798,7 @@ return block_done; /* Fill the window with any remaining input. */- have = s->window_size - s->strstart;+ have = (unsigned)(s->window_size - s->strstart); if (s->strm->avail_in > have && s->block_start >= (long)s->w_size) { /* Slide the window down. */ s->block_start -= s->w_size;@@ -1781,11 +1825,11 @@ * have enough input for a worthy block, or if flushing and there is enough * room for the remaining input as a stored block in the pending buffer. */- have = (s->bi_valid + 42) >> 3; /* number of header bytes */+ have = ((unsigned)s->bi_valid + 42) >> 3; /* bytes in header */ /* maximum stored block length that will fit in pending: */- have = MIN(s->pending_buf_size - have, MAX_STORED);+ have = (unsigned)MIN(s->pending_buf_size - have, MAX_STORED); min_block = MIN(have, s->w_size);- left = s->strstart - s->block_start;+ left = (unsigned)(s->strstart - s->block_start); if (left >= min_block || ((left || flush == Z_FINISH) && flush != Z_NO_FLUSH && s->strm->avail_in == 0 && left <= have)) {@@ -1798,6 +1842,8 @@ } /* We've done all we can with the available input and output. */+ if (last)+ s->bi_used = 8; return last ? finish_started : need_more; } @@ -1846,7 +1892,7 @@ /* longest_match() sets match_start */ } if (s->match_length >= MIN_MATCH) {- check_match(s, s->strstart, s->match_start, s->match_length);+ check_match(s, s->strstart, s->match_start, (int)s->match_length); _tr_tally_dist(s, s->strstart - s->match_start, s->match_length - MIN_MATCH, bflush);@@ -1968,7 +2014,7 @@ uInt max_insert = s->strstart + s->lookahead - MIN_MATCH; /* Do not insert strings in hash table beyond this. */ - check_match(s, s->strstart - 1, s->prev_match, s->prev_length);+ check_match(s, s->strstart - 1, s->prev_match, (int)s->prev_length); _tr_tally_dist(s, s->strstart - 1 - s->prev_match, s->prev_length - MIN_MATCH, bflush);@@ -2076,7 +2122,7 @@ /* Emit match if have run of MIN_MATCH or longer, else emit literal */ if (s->match_length >= MIN_MATCH) {- check_match(s, s->strstart, s->strstart - 1, s->match_length);+ check_match(s, s->strstart, s->strstart - 1, (int)s->match_length); _tr_tally_dist(s, 1, s->match_length - MIN_MATCH, bflush);
cbits/deflate.h view
@@ -1,5 +1,5 @@ /* deflate.h -- internal compression state- * Copyright (C) 1995-2024 Jean-loup Gailly+ * Copyright (C) 1995-2026 Jean-loup Gailly * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -271,6 +271,9 @@ /* Number of valid bits in bi_buf. All bits above the last valid bit * are always zero. */+ int bi_used;+ /* Last number of used bits when going to a byte boundary.+ */ ulg high_water; /* High water mark offset in window for initialized bytes -- bytes above@@ -278,6 +281,9 @@ * longest match routines access bytes past the input. This is then * updated to the new high water mark. */++ int slid;+ /* True if the hash table has been slid since it was cleared. */ } FAR deflate_state;
cbits/gzguts.h view
@@ -1,5 +1,5 @@ /* gzguts.h -- zlib internal header definitions for gz* operations- * Copyright (C) 2004-2024 Mark Adler+ * Copyright (C) 2004-2026 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -17,6 +17,18 @@ # define ZLIB_INTERNAL #endif +#if defined(_WIN32)+# ifndef WIN32_LEAN_AND_MEAN+# define WIN32_LEAN_AND_MEAN+# endif+# ifndef _CRT_SECURE_NO_WARNINGS+# define _CRT_SECURE_NO_WARNINGS+# endif+# ifndef _CRT_NONSTDC_NO_DEPRECATE+# define _CRT_NONSTDC_NO_DEPRECATE+# endif+#endif+ #include <stdio.h> #include "zlib.h" #ifdef STDC@@ -25,8 +37,8 @@ # include <limits.h> #endif -#ifndef _POSIX_SOURCE-# define _POSIX_SOURCE+#ifndef _POSIX_C_SOURCE+# define _POSIX_C_SOURCE 200112L #endif #include <fcntl.h> @@ -36,19 +48,13 @@ #if defined(__TURBOC__) || defined(_MSC_VER) || defined(_WIN32) # include <io.h>+# include <sys/stat.h> #endif -#if defined(_WIN32)+#if defined(_WIN32) && !defined(WIDECHAR) # define WIDECHAR #endif -#ifdef WINAPI_FAMILY-# define open _open-# define read _read-# define write _write-# define close _close-#endif- #ifdef NO_DEFLATE /* for compatibility with old definition */ # define NO_GZCOMPRESS #endif@@ -72,33 +78,28 @@ #endif #ifndef HAVE_VSNPRINTF-# ifdef MSDOS+# if !defined(NO_vsnprintf) && \+ (defined(MSDOS) || defined(__TURBOC__) || defined(__SASC) || \+ defined(VMS) || defined(__OS400) || defined(__MVS__)) /* vsnprintf may exist on some MS-DOS compilers (DJGPP?), but for now we just assume it doesn't. */ # define NO_vsnprintf # endif-# ifdef __TURBOC__-# define NO_vsnprintf-# endif # ifdef WIN32 /* In Win32, vsnprintf is available as the "non-ANSI" _vsnprintf. */-# if !defined(vsnprintf) && !defined(NO_vsnprintf)-# if !defined(_MSC_VER) || ( defined(_MSC_VER) && _MSC_VER < 1500 )-# define vsnprintf _vsnprintf+# if !defined(_MSC_VER) || ( defined(_MSC_VER) && _MSC_VER < 1500 )+# ifndef vsnprintf+# define vsnprintf _vsnprintf # endif # endif-# endif-# ifdef __SASC-# define NO_vsnprintf-# endif-# ifdef VMS-# define NO_vsnprintf-# endif-# ifdef __OS400__-# define NO_vsnprintf-# endif-# ifdef __MVS__-# define NO_vsnprintf+# elif !defined(__STDC_VERSION__) || __STDC_VERSION__-0 < 199901L+/* Otherwise if C89/90, assume no C99 snprintf() or vsnprintf() */+# ifndef NO_snprintf+# define NO_snprintf+# endif+# ifndef NO_vsnprintf+# define NO_vsnprintf+# endif # endif #endif @@ -182,7 +183,9 @@ unsigned char *out; /* output buffer (double-sized when reading) */ int direct; /* 0 if processing gzip, 1 if transparent */ /* just for reading */+ int junk; /* -1 = start, 1 = junk candidate, 0 = in gzip */ int how; /* 0: get header, 1: copy, 2: decompress */+ int again; /* true if EAGAIN or EWOULDBLOCK on last i/o */ z_off64_t start; /* where the gzip data started, for rewinding */ int eof; /* true if end of input file reached */ int past; /* true if read requested past end */@@ -192,7 +195,6 @@ int reset; /* true if a reset is pending after a Z_FINISH */ /* seek request */ z_off64_t skip; /* amount to skip (already rewound if backwards) */- int seek; /* true if seek request pending */ /* error information */ int err; /* error code */ char *msg; /* error message */
cbits/infback.c view
@@ -1,5 +1,5 @@ /* infback.c -- inflate using a call-back interface- * Copyright (C) 1995-2022 Mark Adler+ * Copyright (C) 1995-2026 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -46,7 +46,7 @@ #ifdef Z_SOLO return Z_STREAM_ERROR; #else- strm->zfree = zcfree;+ strm->zfree = zcfree; #endif state = (struct inflate_state FAR *)ZALLOC(strm, 1, sizeof(struct inflate_state));@@ -63,57 +63,6 @@ return Z_OK; } -/*- Return state with length and distance decoding tables and index sizes set to- fixed code decoding. Normally this returns fixed tables from inffixed.h.- If BUILDFIXED is defined, then instead this routine builds the tables the- first time it's called, and returns those tables the first time and- thereafter. This reduces the size of the code by about 2K bytes, in- exchange for a little execution time. However, BUILDFIXED should not be- used for threaded applications, since the rewriting of the tables and virgin- may not be thread-safe.- */-local void fixedtables(struct inflate_state FAR *state) {-#ifdef BUILDFIXED- static int virgin = 1;- static code *lenfix, *distfix;- static code fixed[544];-- /* build fixed huffman tables if first call (may not be thread safe) */- if (virgin) {- unsigned sym, bits;- static code *next;-- /* literal/length table */- sym = 0;- while (sym < 144) state->lens[sym++] = 8;- while (sym < 256) state->lens[sym++] = 9;- while (sym < 280) state->lens[sym++] = 7;- while (sym < 288) state->lens[sym++] = 8;- next = fixed;- lenfix = next;- bits = 9;- inflate_table(LENS, state->lens, 288, &(next), &(bits), state->work);-- /* distance table */- sym = 0;- while (sym < 32) state->lens[sym++] = 5;- distfix = next;- bits = 5;- inflate_table(DISTS, state->lens, 32, &(next), &(bits), state->work);-- /* do this just once */- virgin = 0;- }-#else /* !BUILDFIXED */-# include "inffixed.h"-#endif /* BUILDFIXED */- state->lencode = lenfix;- state->lenbits = 9;- state->distcode = distfix;- state->distbits = 5;-}- /* Macros for inflateBack(): */ /* Load returned state from inflate_fast() */@@ -293,7 +242,7 @@ state->mode = STORED; break; case 1: /* fixed block */- fixedtables(state);+ inflate_fixed(state); Tracev((stderr, "inflate: fixed codes block%s\n", state->last ? " (last)" : "")); state->mode = LEN; /* decode codes */@@ -303,8 +252,8 @@ state->last ? " (last)" : "")); state->mode = TABLE; break;- case 3:- strm->msg = (char *)"invalid block type";+ default:+ strm->msg = (z_const char *)"invalid block type"; state->mode = BAD; } DROPBITS(2);@@ -315,7 +264,7 @@ BYTEBITS(); /* go to byte boundary */ NEEDBITS(32); if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) {- strm->msg = (char *)"invalid stored block lengths";+ strm->msg = (z_const char *)"invalid stored block lengths"; state->mode = BAD; break; }@@ -353,7 +302,8 @@ DROPBITS(4); #ifndef PKZIP_BUG_WORKAROUND if (state->nlen > 286 || state->ndist > 30) {- strm->msg = (char *)"too many length or distance symbols";+ strm->msg = (z_const char *)+ "too many length or distance symbols"; state->mode = BAD; break; }@@ -375,7 +325,7 @@ ret = inflate_table(CODES, state->lens, 19, &(state->next), &(state->lenbits), state->work); if (ret) {- strm->msg = (char *)"invalid code lengths set";+ strm->msg = (z_const char *)"invalid code lengths set"; state->mode = BAD; break; }@@ -398,7 +348,8 @@ NEEDBITS(here.bits + 2); DROPBITS(here.bits); if (state->have == 0) {- strm->msg = (char *)"invalid bit length repeat";+ strm->msg = (z_const char *)+ "invalid bit length repeat"; state->mode = BAD; break; }@@ -421,7 +372,8 @@ DROPBITS(7); } if (state->have + copy > state->nlen + state->ndist) {- strm->msg = (char *)"invalid bit length repeat";+ strm->msg = (z_const char *)+ "invalid bit length repeat"; state->mode = BAD; break; }@@ -435,7 +387,8 @@ /* check for end-of-block code (better have one) */ if (state->lens[256] == 0) {- strm->msg = (char *)"invalid code -- missing end-of-block";+ strm->msg = (z_const char *)+ "invalid code -- missing end-of-block"; state->mode = BAD; break; }@@ -449,7 +402,7 @@ ret = inflate_table(LENS, state->lens, state->nlen, &(state->next), &(state->lenbits), state->work); if (ret) {- strm->msg = (char *)"invalid literal/lengths set";+ strm->msg = (z_const char *)"invalid literal/lengths set"; state->mode = BAD; break; }@@ -458,7 +411,7 @@ ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist, &(state->next), &(state->distbits), state->work); if (ret) {- strm->msg = (char *)"invalid distances set";+ strm->msg = (z_const char *)"invalid distances set"; state->mode = BAD; break; }@@ -517,7 +470,7 @@ /* invalid code */ if (here.op & 64) {- strm->msg = (char *)"invalid literal/length code";+ strm->msg = (z_const char *)"invalid literal/length code"; state->mode = BAD; break; }@@ -549,7 +502,7 @@ } DROPBITS(here.bits); if (here.op & 64) {- strm->msg = (char *)"invalid distance code";+ strm->msg = (z_const char *)"invalid distance code"; state->mode = BAD; break; }@@ -564,7 +517,7 @@ } if (state->offset > state->wsize - (state->whave < state->wsize ? left : 0)) {- strm->msg = (char *)"invalid distance too far back";+ strm->msg = (z_const char *)"invalid distance too far back"; state->mode = BAD; break; }
cbits/inffast.c view
@@ -1,5 +1,5 @@ /* inffast.c -- fast decoding- * Copyright (C) 1995-2017 Mark Adler+ * Copyright (C) 1995-2026 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -155,7 +155,8 @@ dist += (unsigned)hold & ((1U << op) - 1); #ifdef INFLATE_STRICT if (dist > dmax) {- strm->msg = (char *)"invalid distance too far back";+ strm->msg = (z_const char *)+ "invalid distance too far back"; state->mode = BAD; break; }@@ -168,8 +169,8 @@ op = dist - op; /* distance back in window */ if (op > whave) { if (state->sane) {- strm->msg =- (char *)"invalid distance too far back";+ strm->msg = (z_const char *)+ "invalid distance too far back"; state->mode = BAD; break; }@@ -265,7 +266,7 @@ goto dodist; } else {- strm->msg = (char *)"invalid distance code";+ strm->msg = (z_const char *)"invalid distance code"; state->mode = BAD; break; }@@ -280,7 +281,7 @@ break; } else {- strm->msg = (char *)"invalid literal/length code";+ strm->msg = (z_const char *)"invalid literal/length code"; state->mode = BAD; break; }
cbits/inffixed.h view
@@ -1,94 +1,94 @@- /* inffixed.h -- table for decoding fixed codes- * Generated automatically by makefixed().- */+/* inffixed.h -- table for decoding fixed codes+ * Generated automatically by makefixed().+ */ - /* WARNING: this file should *not* be used by applications.- It is part of the implementation of this library and is- subject to change. Applications should only use zlib.h.- */+/* WARNING: this file should *not* be used by applications.+ It is part of the implementation of this library and is+ subject to change. Applications should only use zlib.h.+ */ - static const code lenfix[512] = {- {96,7,0},{0,8,80},{0,8,16},{20,8,115},{18,7,31},{0,8,112},{0,8,48},- {0,9,192},{16,7,10},{0,8,96},{0,8,32},{0,9,160},{0,8,0},{0,8,128},- {0,8,64},{0,9,224},{16,7,6},{0,8,88},{0,8,24},{0,9,144},{19,7,59},- {0,8,120},{0,8,56},{0,9,208},{17,7,17},{0,8,104},{0,8,40},{0,9,176},- {0,8,8},{0,8,136},{0,8,72},{0,9,240},{16,7,4},{0,8,84},{0,8,20},- {21,8,227},{19,7,43},{0,8,116},{0,8,52},{0,9,200},{17,7,13},{0,8,100},- {0,8,36},{0,9,168},{0,8,4},{0,8,132},{0,8,68},{0,9,232},{16,7,8},- {0,8,92},{0,8,28},{0,9,152},{20,7,83},{0,8,124},{0,8,60},{0,9,216},- {18,7,23},{0,8,108},{0,8,44},{0,9,184},{0,8,12},{0,8,140},{0,8,76},- {0,9,248},{16,7,3},{0,8,82},{0,8,18},{21,8,163},{19,7,35},{0,8,114},- {0,8,50},{0,9,196},{17,7,11},{0,8,98},{0,8,34},{0,9,164},{0,8,2},- {0,8,130},{0,8,66},{0,9,228},{16,7,7},{0,8,90},{0,8,26},{0,9,148},- {20,7,67},{0,8,122},{0,8,58},{0,9,212},{18,7,19},{0,8,106},{0,8,42},- {0,9,180},{0,8,10},{0,8,138},{0,8,74},{0,9,244},{16,7,5},{0,8,86},- {0,8,22},{64,8,0},{19,7,51},{0,8,118},{0,8,54},{0,9,204},{17,7,15},- {0,8,102},{0,8,38},{0,9,172},{0,8,6},{0,8,134},{0,8,70},{0,9,236},- {16,7,9},{0,8,94},{0,8,30},{0,9,156},{20,7,99},{0,8,126},{0,8,62},- {0,9,220},{18,7,27},{0,8,110},{0,8,46},{0,9,188},{0,8,14},{0,8,142},- {0,8,78},{0,9,252},{96,7,0},{0,8,81},{0,8,17},{21,8,131},{18,7,31},- {0,8,113},{0,8,49},{0,9,194},{16,7,10},{0,8,97},{0,8,33},{0,9,162},- {0,8,1},{0,8,129},{0,8,65},{0,9,226},{16,7,6},{0,8,89},{0,8,25},- {0,9,146},{19,7,59},{0,8,121},{0,8,57},{0,9,210},{17,7,17},{0,8,105},- {0,8,41},{0,9,178},{0,8,9},{0,8,137},{0,8,73},{0,9,242},{16,7,4},- {0,8,85},{0,8,21},{16,8,258},{19,7,43},{0,8,117},{0,8,53},{0,9,202},- {17,7,13},{0,8,101},{0,8,37},{0,9,170},{0,8,5},{0,8,133},{0,8,69},- {0,9,234},{16,7,8},{0,8,93},{0,8,29},{0,9,154},{20,7,83},{0,8,125},- {0,8,61},{0,9,218},{18,7,23},{0,8,109},{0,8,45},{0,9,186},{0,8,13},- {0,8,141},{0,8,77},{0,9,250},{16,7,3},{0,8,83},{0,8,19},{21,8,195},- {19,7,35},{0,8,115},{0,8,51},{0,9,198},{17,7,11},{0,8,99},{0,8,35},- {0,9,166},{0,8,3},{0,8,131},{0,8,67},{0,9,230},{16,7,7},{0,8,91},- {0,8,27},{0,9,150},{20,7,67},{0,8,123},{0,8,59},{0,9,214},{18,7,19},- {0,8,107},{0,8,43},{0,9,182},{0,8,11},{0,8,139},{0,8,75},{0,9,246},- {16,7,5},{0,8,87},{0,8,23},{64,8,0},{19,7,51},{0,8,119},{0,8,55},- {0,9,206},{17,7,15},{0,8,103},{0,8,39},{0,9,174},{0,8,7},{0,8,135},- {0,8,71},{0,9,238},{16,7,9},{0,8,95},{0,8,31},{0,9,158},{20,7,99},- {0,8,127},{0,8,63},{0,9,222},{18,7,27},{0,8,111},{0,8,47},{0,9,190},- {0,8,15},{0,8,143},{0,8,79},{0,9,254},{96,7,0},{0,8,80},{0,8,16},- {20,8,115},{18,7,31},{0,8,112},{0,8,48},{0,9,193},{16,7,10},{0,8,96},- {0,8,32},{0,9,161},{0,8,0},{0,8,128},{0,8,64},{0,9,225},{16,7,6},- {0,8,88},{0,8,24},{0,9,145},{19,7,59},{0,8,120},{0,8,56},{0,9,209},- {17,7,17},{0,8,104},{0,8,40},{0,9,177},{0,8,8},{0,8,136},{0,8,72},- {0,9,241},{16,7,4},{0,8,84},{0,8,20},{21,8,227},{19,7,43},{0,8,116},- {0,8,52},{0,9,201},{17,7,13},{0,8,100},{0,8,36},{0,9,169},{0,8,4},- {0,8,132},{0,8,68},{0,9,233},{16,7,8},{0,8,92},{0,8,28},{0,9,153},- {20,7,83},{0,8,124},{0,8,60},{0,9,217},{18,7,23},{0,8,108},{0,8,44},- {0,9,185},{0,8,12},{0,8,140},{0,8,76},{0,9,249},{16,7,3},{0,8,82},- {0,8,18},{21,8,163},{19,7,35},{0,8,114},{0,8,50},{0,9,197},{17,7,11},- {0,8,98},{0,8,34},{0,9,165},{0,8,2},{0,8,130},{0,8,66},{0,9,229},- {16,7,7},{0,8,90},{0,8,26},{0,9,149},{20,7,67},{0,8,122},{0,8,58},- {0,9,213},{18,7,19},{0,8,106},{0,8,42},{0,9,181},{0,8,10},{0,8,138},- {0,8,74},{0,9,245},{16,7,5},{0,8,86},{0,8,22},{64,8,0},{19,7,51},- {0,8,118},{0,8,54},{0,9,205},{17,7,15},{0,8,102},{0,8,38},{0,9,173},- {0,8,6},{0,8,134},{0,8,70},{0,9,237},{16,7,9},{0,8,94},{0,8,30},- {0,9,157},{20,7,99},{0,8,126},{0,8,62},{0,9,221},{18,7,27},{0,8,110},- {0,8,46},{0,9,189},{0,8,14},{0,8,142},{0,8,78},{0,9,253},{96,7,0},- {0,8,81},{0,8,17},{21,8,131},{18,7,31},{0,8,113},{0,8,49},{0,9,195},- {16,7,10},{0,8,97},{0,8,33},{0,9,163},{0,8,1},{0,8,129},{0,8,65},- {0,9,227},{16,7,6},{0,8,89},{0,8,25},{0,9,147},{19,7,59},{0,8,121},- {0,8,57},{0,9,211},{17,7,17},{0,8,105},{0,8,41},{0,9,179},{0,8,9},- {0,8,137},{0,8,73},{0,9,243},{16,7,4},{0,8,85},{0,8,21},{16,8,258},- {19,7,43},{0,8,117},{0,8,53},{0,9,203},{17,7,13},{0,8,101},{0,8,37},- {0,9,171},{0,8,5},{0,8,133},{0,8,69},{0,9,235},{16,7,8},{0,8,93},- {0,8,29},{0,9,155},{20,7,83},{0,8,125},{0,8,61},{0,9,219},{18,7,23},- {0,8,109},{0,8,45},{0,9,187},{0,8,13},{0,8,141},{0,8,77},{0,9,251},- {16,7,3},{0,8,83},{0,8,19},{21,8,195},{19,7,35},{0,8,115},{0,8,51},- {0,9,199},{17,7,11},{0,8,99},{0,8,35},{0,9,167},{0,8,3},{0,8,131},- {0,8,67},{0,9,231},{16,7,7},{0,8,91},{0,8,27},{0,9,151},{20,7,67},- {0,8,123},{0,8,59},{0,9,215},{18,7,19},{0,8,107},{0,8,43},{0,9,183},- {0,8,11},{0,8,139},{0,8,75},{0,9,247},{16,7,5},{0,8,87},{0,8,23},- {64,8,0},{19,7,51},{0,8,119},{0,8,55},{0,9,207},{17,7,15},{0,8,103},- {0,8,39},{0,9,175},{0,8,7},{0,8,135},{0,8,71},{0,9,239},{16,7,9},- {0,8,95},{0,8,31},{0,9,159},{20,7,99},{0,8,127},{0,8,63},{0,9,223},- {18,7,27},{0,8,111},{0,8,47},{0,9,191},{0,8,15},{0,8,143},{0,8,79},- {0,9,255}- };+static const code lenfix[512] = {+ {96,7,0},{0,8,80},{0,8,16},{20,8,115},{18,7,31},{0,8,112},{0,8,48},+ {0,9,192},{16,7,10},{0,8,96},{0,8,32},{0,9,160},{0,8,0},{0,8,128},+ {0,8,64},{0,9,224},{16,7,6},{0,8,88},{0,8,24},{0,9,144},{19,7,59},+ {0,8,120},{0,8,56},{0,9,208},{17,7,17},{0,8,104},{0,8,40},{0,9,176},+ {0,8,8},{0,8,136},{0,8,72},{0,9,240},{16,7,4},{0,8,84},{0,8,20},+ {21,8,227},{19,7,43},{0,8,116},{0,8,52},{0,9,200},{17,7,13},{0,8,100},+ {0,8,36},{0,9,168},{0,8,4},{0,8,132},{0,8,68},{0,9,232},{16,7,8},+ {0,8,92},{0,8,28},{0,9,152},{20,7,83},{0,8,124},{0,8,60},{0,9,216},+ {18,7,23},{0,8,108},{0,8,44},{0,9,184},{0,8,12},{0,8,140},{0,8,76},+ {0,9,248},{16,7,3},{0,8,82},{0,8,18},{21,8,163},{19,7,35},{0,8,114},+ {0,8,50},{0,9,196},{17,7,11},{0,8,98},{0,8,34},{0,9,164},{0,8,2},+ {0,8,130},{0,8,66},{0,9,228},{16,7,7},{0,8,90},{0,8,26},{0,9,148},+ {20,7,67},{0,8,122},{0,8,58},{0,9,212},{18,7,19},{0,8,106},{0,8,42},+ {0,9,180},{0,8,10},{0,8,138},{0,8,74},{0,9,244},{16,7,5},{0,8,86},+ {0,8,22},{64,8,0},{19,7,51},{0,8,118},{0,8,54},{0,9,204},{17,7,15},+ {0,8,102},{0,8,38},{0,9,172},{0,8,6},{0,8,134},{0,8,70},{0,9,236},+ {16,7,9},{0,8,94},{0,8,30},{0,9,156},{20,7,99},{0,8,126},{0,8,62},+ {0,9,220},{18,7,27},{0,8,110},{0,8,46},{0,9,188},{0,8,14},{0,8,142},+ {0,8,78},{0,9,252},{96,7,0},{0,8,81},{0,8,17},{21,8,131},{18,7,31},+ {0,8,113},{0,8,49},{0,9,194},{16,7,10},{0,8,97},{0,8,33},{0,9,162},+ {0,8,1},{0,8,129},{0,8,65},{0,9,226},{16,7,6},{0,8,89},{0,8,25},+ {0,9,146},{19,7,59},{0,8,121},{0,8,57},{0,9,210},{17,7,17},{0,8,105},+ {0,8,41},{0,9,178},{0,8,9},{0,8,137},{0,8,73},{0,9,242},{16,7,4},+ {0,8,85},{0,8,21},{16,8,258},{19,7,43},{0,8,117},{0,8,53},{0,9,202},+ {17,7,13},{0,8,101},{0,8,37},{0,9,170},{0,8,5},{0,8,133},{0,8,69},+ {0,9,234},{16,7,8},{0,8,93},{0,8,29},{0,9,154},{20,7,83},{0,8,125},+ {0,8,61},{0,9,218},{18,7,23},{0,8,109},{0,8,45},{0,9,186},{0,8,13},+ {0,8,141},{0,8,77},{0,9,250},{16,7,3},{0,8,83},{0,8,19},{21,8,195},+ {19,7,35},{0,8,115},{0,8,51},{0,9,198},{17,7,11},{0,8,99},{0,8,35},+ {0,9,166},{0,8,3},{0,8,131},{0,8,67},{0,9,230},{16,7,7},{0,8,91},+ {0,8,27},{0,9,150},{20,7,67},{0,8,123},{0,8,59},{0,9,214},{18,7,19},+ {0,8,107},{0,8,43},{0,9,182},{0,8,11},{0,8,139},{0,8,75},{0,9,246},+ {16,7,5},{0,8,87},{0,8,23},{64,8,0},{19,7,51},{0,8,119},{0,8,55},+ {0,9,206},{17,7,15},{0,8,103},{0,8,39},{0,9,174},{0,8,7},{0,8,135},+ {0,8,71},{0,9,238},{16,7,9},{0,8,95},{0,8,31},{0,9,158},{20,7,99},+ {0,8,127},{0,8,63},{0,9,222},{18,7,27},{0,8,111},{0,8,47},{0,9,190},+ {0,8,15},{0,8,143},{0,8,79},{0,9,254},{96,7,0},{0,8,80},{0,8,16},+ {20,8,115},{18,7,31},{0,8,112},{0,8,48},{0,9,193},{16,7,10},{0,8,96},+ {0,8,32},{0,9,161},{0,8,0},{0,8,128},{0,8,64},{0,9,225},{16,7,6},+ {0,8,88},{0,8,24},{0,9,145},{19,7,59},{0,8,120},{0,8,56},{0,9,209},+ {17,7,17},{0,8,104},{0,8,40},{0,9,177},{0,8,8},{0,8,136},{0,8,72},+ {0,9,241},{16,7,4},{0,8,84},{0,8,20},{21,8,227},{19,7,43},{0,8,116},+ {0,8,52},{0,9,201},{17,7,13},{0,8,100},{0,8,36},{0,9,169},{0,8,4},+ {0,8,132},{0,8,68},{0,9,233},{16,7,8},{0,8,92},{0,8,28},{0,9,153},+ {20,7,83},{0,8,124},{0,8,60},{0,9,217},{18,7,23},{0,8,108},{0,8,44},+ {0,9,185},{0,8,12},{0,8,140},{0,8,76},{0,9,249},{16,7,3},{0,8,82},+ {0,8,18},{21,8,163},{19,7,35},{0,8,114},{0,8,50},{0,9,197},{17,7,11},+ {0,8,98},{0,8,34},{0,9,165},{0,8,2},{0,8,130},{0,8,66},{0,9,229},+ {16,7,7},{0,8,90},{0,8,26},{0,9,149},{20,7,67},{0,8,122},{0,8,58},+ {0,9,213},{18,7,19},{0,8,106},{0,8,42},{0,9,181},{0,8,10},{0,8,138},+ {0,8,74},{0,9,245},{16,7,5},{0,8,86},{0,8,22},{64,8,0},{19,7,51},+ {0,8,118},{0,8,54},{0,9,205},{17,7,15},{0,8,102},{0,8,38},{0,9,173},+ {0,8,6},{0,8,134},{0,8,70},{0,9,237},{16,7,9},{0,8,94},{0,8,30},+ {0,9,157},{20,7,99},{0,8,126},{0,8,62},{0,9,221},{18,7,27},{0,8,110},+ {0,8,46},{0,9,189},{0,8,14},{0,8,142},{0,8,78},{0,9,253},{96,7,0},+ {0,8,81},{0,8,17},{21,8,131},{18,7,31},{0,8,113},{0,8,49},{0,9,195},+ {16,7,10},{0,8,97},{0,8,33},{0,9,163},{0,8,1},{0,8,129},{0,8,65},+ {0,9,227},{16,7,6},{0,8,89},{0,8,25},{0,9,147},{19,7,59},{0,8,121},+ {0,8,57},{0,9,211},{17,7,17},{0,8,105},{0,8,41},{0,9,179},{0,8,9},+ {0,8,137},{0,8,73},{0,9,243},{16,7,4},{0,8,85},{0,8,21},{16,8,258},+ {19,7,43},{0,8,117},{0,8,53},{0,9,203},{17,7,13},{0,8,101},{0,8,37},+ {0,9,171},{0,8,5},{0,8,133},{0,8,69},{0,9,235},{16,7,8},{0,8,93},+ {0,8,29},{0,9,155},{20,7,83},{0,8,125},{0,8,61},{0,9,219},{18,7,23},+ {0,8,109},{0,8,45},{0,9,187},{0,8,13},{0,8,141},{0,8,77},{0,9,251},+ {16,7,3},{0,8,83},{0,8,19},{21,8,195},{19,7,35},{0,8,115},{0,8,51},+ {0,9,199},{17,7,11},{0,8,99},{0,8,35},{0,9,167},{0,8,3},{0,8,131},+ {0,8,67},{0,9,231},{16,7,7},{0,8,91},{0,8,27},{0,9,151},{20,7,67},+ {0,8,123},{0,8,59},{0,9,215},{18,7,19},{0,8,107},{0,8,43},{0,9,183},+ {0,8,11},{0,8,139},{0,8,75},{0,9,247},{16,7,5},{0,8,87},{0,8,23},+ {64,8,0},{19,7,51},{0,8,119},{0,8,55},{0,9,207},{17,7,15},{0,8,103},+ {0,8,39},{0,9,175},{0,8,7},{0,8,135},{0,8,71},{0,9,239},{16,7,9},+ {0,8,95},{0,8,31},{0,9,159},{20,7,99},{0,8,127},{0,8,63},{0,9,223},+ {18,7,27},{0,8,111},{0,8,47},{0,9,191},{0,8,15},{0,8,143},{0,8,79},+ {0,9,255}+}; - static const code distfix[32] = {- {16,5,1},{23,5,257},{19,5,17},{27,5,4097},{17,5,5},{25,5,1025},- {21,5,65},{29,5,16385},{16,5,3},{24,5,513},{20,5,33},{28,5,8193},- {18,5,9},{26,5,2049},{22,5,129},{64,5,0},{16,5,2},{23,5,385},- {19,5,25},{27,5,6145},{17,5,7},{25,5,1537},{21,5,97},{29,5,24577},- {16,5,4},{24,5,769},{20,5,49},{28,5,12289},{18,5,13},{26,5,3073},- {22,5,193},{64,5,0}- };+static const code distfix[32] = {+ {16,5,1},{23,5,257},{19,5,17},{27,5,4097},{17,5,5},{25,5,1025},+ {21,5,65},{29,5,16385},{16,5,3},{24,5,513},{20,5,33},{28,5,8193},+ {18,5,9},{26,5,2049},{22,5,129},{64,5,0},{16,5,2},{23,5,385},+ {19,5,25},{27,5,6145},{17,5,7},{25,5,1537},{21,5,97},{29,5,24577},+ {16,5,4},{24,5,769},{20,5,49},{28,5,12289},{18,5,13},{26,5,3073},+ {22,5,193},{64,5,0}+};
cbits/inflate.c view
@@ -1,5 +1,5 @@ /* inflate.c -- zlib decompression- * Copyright (C) 1995-2022 Mark Adler+ * Copyright (C) 1995-2026 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -85,12 +85,6 @@ #include "inflate.h" #include "inffast.h" -#ifdef MAKEFIXED-# ifndef BUILDFIXED-# define BUILDFIXED-# endif-#endif- local int inflateStateCheck(z_streamp strm) { struct inflate_state FAR *state; if (strm == Z_NULL ||@@ -110,6 +104,7 @@ state = (struct inflate_state FAR *)strm->state; strm->total_in = strm->total_out = state->total = 0; strm->msg = Z_NULL;+ strm->data_type = 0; if (state->wrap) /* to support ill-conceived Java test suite */ strm->adler = state->wrap & 1; state->mode = HEAD;@@ -202,6 +197,7 @@ state = (struct inflate_state FAR *) ZALLOC(strm, 1, sizeof(struct inflate_state)); if (state == Z_NULL) return Z_MEM_ERROR;+ zmemzero(state, sizeof(struct inflate_state)); Tracev((stderr, "inflate: allocated\n")); strm->state = (struct internal_state FAR *)state; state->strm = strm;@@ -234,124 +230,12 @@ } if (bits > 16 || state->bits + (uInt)bits > 32) return Z_STREAM_ERROR; value &= (1L << bits) - 1;- state->hold += (unsigned)value << state->bits;+ state->hold += (unsigned long)value << state->bits; state->bits += (uInt)bits; return Z_OK; } /*- Return state with length and distance decoding tables and index sizes set to- fixed code decoding. Normally this returns fixed tables from inffixed.h.- If BUILDFIXED is defined, then instead this routine builds the tables the- first time it's called, and returns those tables the first time and- thereafter. This reduces the size of the code by about 2K bytes, in- exchange for a little execution time. However, BUILDFIXED should not be- used for threaded applications, since the rewriting of the tables and virgin- may not be thread-safe.- */-local void fixedtables(struct inflate_state FAR *state) {-#ifdef BUILDFIXED- static int virgin = 1;- static code *lenfix, *distfix;- static code fixed[544];-- /* build fixed huffman tables if first call (may not be thread safe) */- if (virgin) {- unsigned sym, bits;- static code *next;-- /* literal/length table */- sym = 0;- while (sym < 144) state->lens[sym++] = 8;- while (sym < 256) state->lens[sym++] = 9;- while (sym < 280) state->lens[sym++] = 7;- while (sym < 288) state->lens[sym++] = 8;- next = fixed;- lenfix = next;- bits = 9;- inflate_table(LENS, state->lens, 288, &(next), &(bits), state->work);-- /* distance table */- sym = 0;- while (sym < 32) state->lens[sym++] = 5;- distfix = next;- bits = 5;- inflate_table(DISTS, state->lens, 32, &(next), &(bits), state->work);-- /* do this just once */- virgin = 0;- }-#else /* !BUILDFIXED */-# include "inffixed.h"-#endif /* BUILDFIXED */- state->lencode = lenfix;- state->lenbits = 9;- state->distcode = distfix;- state->distbits = 5;-}--#ifdef MAKEFIXED-#include <stdio.h>--/*- Write out the inffixed.h that is #include'd above. Defining MAKEFIXED also- defines BUILDFIXED, so the tables are built on the fly. makefixed() writes- those tables to stdout, which would be piped to inffixed.h. A small program- can simply call makefixed to do this:-- void makefixed(void);-- int main(void)- {- makefixed();- return 0;- }-- Then that can be linked with zlib built with MAKEFIXED defined and run:-- a.out > inffixed.h- */-void makefixed(void)-{- unsigned low, size;- struct inflate_state state;-- fixedtables(&state);- puts(" /* inffixed.h -- table for decoding fixed codes");- puts(" * Generated automatically by makefixed().");- puts(" */");- puts("");- puts(" /* WARNING: this file should *not* be used by applications.");- puts(" It is part of the implementation of this library and is");- puts(" subject to change. Applications should only use zlib.h.");- puts(" */");- puts("");- size = 1U << 9;- printf(" static const code lenfix[%u] = {", size);- low = 0;- for (;;) {- if ((low % 7) == 0) printf("\n ");- printf("{%u,%u,%d}", (low & 127) == 99 ? 64 : state.lencode[low].op,- state.lencode[low].bits, state.lencode[low].val);- if (++low == size) break;- putchar(',');- }- puts("\n };");- size = 1U << 5;- printf("\n static const code distfix[%u] = {", size);- low = 0;- for (;;) {- if ((low % 6) == 0) printf("\n ");- printf("{%u,%u,%d}", state.distcode[low].op, state.distcode[low].bits,- state.distcode[low].val);- if (++low == size) break;- putchar(',');- }- puts("\n };");-}-#endif /* MAKEFIXED */--/* Update the window with the last wsize (normally 32K) bytes written before returning. If window does not exist yet, create it. This is only called when a window is already in use, or when output has been written during this@@ -642,12 +526,12 @@ if ( #endif ((BITS(8) << 8) + (hold >> 8)) % 31) {- strm->msg = (char *)"incorrect header check";+ strm->msg = (z_const char *)"incorrect header check"; state->mode = BAD; break; } if (BITS(4) != Z_DEFLATED) {- strm->msg = (char *)"unknown compression method";+ strm->msg = (z_const char *)"unknown compression method"; state->mode = BAD; break; }@@ -656,7 +540,7 @@ if (state->wbits == 0) state->wbits = len; if (len > 15 || len > state->wbits) {- strm->msg = (char *)"invalid window size";+ strm->msg = (z_const char *)"invalid window size"; state->mode = BAD; break; }@@ -672,12 +556,12 @@ NEEDBITS(16); state->flags = (int)(hold); if ((state->flags & 0xff) != Z_DEFLATED) {- strm->msg = (char *)"unknown compression method";+ strm->msg = (z_const char *)"unknown compression method"; state->mode = BAD; break; } if (state->flags & 0xe000) {- strm->msg = (char *)"unknown header flags set";+ strm->msg = (z_const char *)"unknown header flags set"; state->mode = BAD; break; }@@ -793,7 +677,7 @@ if (state->flags & 0x0200) { NEEDBITS(16); if ((state->wrap & 4) && hold != (state->check & 0xffff)) {- strm->msg = (char *)"header crc mismatch";+ strm->msg = (z_const char *)"header crc mismatch"; state->mode = BAD; break; }@@ -840,7 +724,7 @@ state->mode = STORED; break; case 1: /* fixed block */- fixedtables(state);+ inflate_fixed(state); Tracev((stderr, "inflate: fixed codes block%s\n", state->last ? " (last)" : "")); state->mode = LEN_; /* decode codes */@@ -854,8 +738,8 @@ state->last ? " (last)" : "")); state->mode = TABLE; break;- case 3:- strm->msg = (char *)"invalid block type";+ default:+ strm->msg = (z_const char *)"invalid block type"; state->mode = BAD; } DROPBITS(2);@@ -864,7 +748,7 @@ BYTEBITS(); /* go to byte boundary */ NEEDBITS(32); if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) {- strm->msg = (char *)"invalid stored block lengths";+ strm->msg = (z_const char *)"invalid stored block lengths"; state->mode = BAD; break; }@@ -905,7 +789,8 @@ DROPBITS(4); #ifndef PKZIP_BUG_WORKAROUND if (state->nlen > 286 || state->ndist > 30) {- strm->msg = (char *)"too many length or distance symbols";+ strm->msg = (z_const char *)+ "too many length or distance symbols"; state->mode = BAD; break; }@@ -923,12 +808,12 @@ while (state->have < 19) state->lens[order[state->have++]] = 0; state->next = state->codes;- state->lencode = (const code FAR *)(state->next);+ state->lencode = state->distcode = (const code FAR *)(state->next); state->lenbits = 7; ret = inflate_table(CODES, state->lens, 19, &(state->next), &(state->lenbits), state->work); if (ret) {- strm->msg = (char *)"invalid code lengths set";+ strm->msg = (z_const char *)"invalid code lengths set"; state->mode = BAD; break; }@@ -952,7 +837,8 @@ NEEDBITS(here.bits + 2); DROPBITS(here.bits); if (state->have == 0) {- strm->msg = (char *)"invalid bit length repeat";+ strm->msg = (z_const char *)+ "invalid bit length repeat"; state->mode = BAD; break; }@@ -975,7 +861,8 @@ DROPBITS(7); } if (state->have + copy > state->nlen + state->ndist) {- strm->msg = (char *)"invalid bit length repeat";+ strm->msg = (z_const char *)+ "invalid bit length repeat"; state->mode = BAD; break; }@@ -989,7 +876,8 @@ /* check for end-of-block code (better have one) */ if (state->lens[256] == 0) {- strm->msg = (char *)"invalid code -- missing end-of-block";+ strm->msg = (z_const char *)+ "invalid code -- missing end-of-block"; state->mode = BAD; break; }@@ -1003,7 +891,7 @@ ret = inflate_table(LENS, state->lens, state->nlen, &(state->next), &(state->lenbits), state->work); if (ret) {- strm->msg = (char *)"invalid literal/lengths set";+ strm->msg = (z_const char *)"invalid literal/lengths set"; state->mode = BAD; break; }@@ -1012,7 +900,7 @@ ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist, &(state->next), &(state->distbits), state->work); if (ret) {- strm->msg = (char *)"invalid distances set";+ strm->msg = (z_const char *)"invalid distances set"; state->mode = BAD; break; }@@ -1066,7 +954,7 @@ break; } if (here.op & 64) {- strm->msg = (char *)"invalid literal/length code";+ strm->msg = (z_const char *)"invalid literal/length code"; state->mode = BAD; break; }@@ -1104,7 +992,7 @@ DROPBITS(here.bits); state->back += here.bits; if (here.op & 64) {- strm->msg = (char *)"invalid distance code";+ strm->msg = (z_const char *)"invalid distance code"; state->mode = BAD; break; }@@ -1121,7 +1009,7 @@ } #ifdef INFLATE_STRICT if (state->offset > state->dmax) {- strm->msg = (char *)"invalid distance too far back";+ strm->msg = (z_const char *)"invalid distance too far back"; state->mode = BAD; break; }@@ -1136,7 +1024,8 @@ copy = state->offset - copy; if (copy > state->whave) { if (state->sane) {- strm->msg = (char *)"invalid distance too far back";+ strm->msg = (z_const char *)+ "invalid distance too far back"; state->mode = BAD; break; }@@ -1195,7 +1084,7 @@ state->flags ? hold : #endif ZSWAP32(hold)) != state->check) {- strm->msg = (char *)"incorrect data check";+ strm->msg = (z_const char *)"incorrect data check"; state->mode = BAD; break; }@@ -1209,7 +1098,7 @@ if (state->wrap && state->flags) { NEEDBITS(32); if ((state->wrap & 4) && hold != (state->total & 0xffffffff)) {- strm->msg = (char *)"incorrect length check";+ strm->msg = (z_const char *)"incorrect length check"; state->mode = BAD; break; }@@ -1440,7 +1329,6 @@ struct inflate_state FAR *state; struct inflate_state FAR *copy; unsigned char FAR *window;- unsigned wsize; /* check input */ if (inflateStateCheck(source) || dest == Z_NULL)@@ -1451,6 +1339,7 @@ copy = (struct inflate_state FAR *) ZALLOC(source, 1, sizeof(struct inflate_state)); if (copy == Z_NULL) return Z_MEM_ERROR;+ zmemzero(copy, sizeof(struct inflate_state)); window = Z_NULL; if (state->window != Z_NULL) { window = (unsigned char FAR *)@@ -1462,8 +1351,8 @@ } /* copy state */- zmemcpy((voidpf)dest, (voidpf)source, sizeof(z_stream));- zmemcpy((voidpf)copy, (voidpf)state, sizeof(struct inflate_state));+ zmemcpy(dest, source, sizeof(z_stream));+ zmemcpy(copy, state, sizeof(struct inflate_state)); copy->strm = dest; if (state->lencode >= state->codes && state->lencode <= state->codes + ENOUGH - 1) {@@ -1471,10 +1360,8 @@ copy->distcode = copy->codes + (state->distcode - state->codes); } copy->next = copy->codes + (state->next - state->codes);- if (window != Z_NULL) {- wsize = 1U << state->wbits;- zmemcpy(window, state->window, wsize);- }+ if (window != Z_NULL)+ zmemcpy(window, state->window, state->whave); copy->window = window; dest->state = (struct internal_state FAR *)copy; return Z_OK;
cbits/inflate.h view
@@ -100,7 +100,7 @@ unsigned char FAR *window; /* allocated sliding window, if needed */ /* bit accumulator */ unsigned long hold; /* input bit accumulator */- unsigned bits; /* number of bits in "in" */+ unsigned bits; /* number of bits in hold */ /* for string and stored block copying */ unsigned length; /* literal or length of data to copy */ unsigned offset; /* distance back to copy string from */
cbits/inftrees.c view
@@ -1,15 +1,29 @@ /* inftrees.c -- generate Huffman trees for efficient decoding- * Copyright (C) 1995-2024 Mark Adler+ * Copyright (C) 1995-2026 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ +#ifdef MAKEFIXED+# ifndef BUILDFIXED+# define BUILDFIXED+# endif+#endif+#ifdef BUILDFIXED+# define Z_ONCE+#endif+ #include "zutil.h" #include "inftrees.h"+#include "inflate.h" +#ifndef NULL+# define NULL 0+#endif+ #define MAXBITS 15 const char inflate_copyright[] =- " inflate 1.3.1 Copyright 1995-2024 Mark Adler ";+ " inflate 1.3.2 Copyright 1995-2026 Mark Adler "; /* If you use the zlib library in a product, an acknowledgment is welcome in the documentation of your product. If for some reason you cannot@@ -47,9 +61,9 @@ unsigned mask; /* mask for low root bits */ code here; /* table entry for duplication */ code FAR *next; /* next available space in table */- const unsigned short FAR *base; /* base value table to use */- const unsigned short FAR *extra; /* extra bits table to use */- unsigned match; /* use base and extra for symbol >= match */+ const unsigned short FAR *base = NULL; /* base value table to use */+ const unsigned short FAR *extra = NULL; /* extra bits table to use */+ unsigned match = 0; /* use base and extra for symbol >= match */ unsigned short count[MAXBITS+1]; /* number of codes of each length */ unsigned short offs[MAXBITS+1]; /* offsets in table for each length */ static const unsigned short lbase[31] = { /* Length codes 257..285 base */@@ -57,7 +71,7 @@ 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0}; static const unsigned short lext[31] = { /* Length codes 257..285 extra */ 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18,- 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 203, 77};+ 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 199, 75}; static const unsigned short dbase[32] = { /* Distance codes 0..29 base */ 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145,@@ -175,7 +189,6 @@ /* set up for code type */ switch (type) { case CODES:- base = extra = work; /* dummy value--not used */ match = 20; break; case LENS:@@ -183,10 +196,9 @@ extra = lext; match = 257; break;- default: /* DISTS */+ case DISTS: base = dbase; extra = dext;- match = 0; } /* initialize state for loop */@@ -297,3 +309,116 @@ *bits = root; return 0; }++#ifdef BUILDFIXED+/*+ If this is compiled with BUILDFIXED defined, and if inflate will be used in+ multiple threads, and if atomics are not available, then inflate() must be+ called with a fixed block (e.g. 0x03 0x00) to initialize the tables and must+ return before any other threads are allowed to call inflate.+ */++static code *lenfix, *distfix;+static code fixed[544];++/* State for z_once(). */+local z_once_t built = Z_ONCE_INIT;++local void buildtables(void) {+ unsigned sym, bits;+ static code *next;+ unsigned short lens[288], work[288];++ /* literal/length table */+ sym = 0;+ while (sym < 144) lens[sym++] = 8;+ while (sym < 256) lens[sym++] = 9;+ while (sym < 280) lens[sym++] = 7;+ while (sym < 288) lens[sym++] = 8;+ next = fixed;+ lenfix = next;+ bits = 9;+ inflate_table(LENS, lens, 288, &(next), &(bits), work);++ /* distance table */+ sym = 0;+ while (sym < 32) lens[sym++] = 5;+ distfix = next;+ bits = 5;+ inflate_table(DISTS, lens, 32, &(next), &(bits), work);+}+#else /* !BUILDFIXED */+# include "inffixed.h"+#endif /* BUILDFIXED */++/*+ Return state with length and distance decoding tables and index sizes set to+ fixed code decoding. Normally this returns fixed tables from inffixed.h.+ If BUILDFIXED is defined, then instead this routine builds the tables the+ first time it's called, and returns those tables the first time and+ thereafter. This reduces the size of the code by about 2K bytes, in+ exchange for a little execution time. However, BUILDFIXED should not be+ used for threaded applications if atomics are not available, as it will+ not be thread-safe.+ */+void inflate_fixed(struct inflate_state FAR *state) {+#ifdef BUILDFIXED+ z_once(&built, buildtables);+#endif /* BUILDFIXED */+ state->lencode = lenfix;+ state->lenbits = 9;+ state->distcode = distfix;+ state->distbits = 5;+}++#ifdef MAKEFIXED+#include <stdio.h>++/*+ Write out the inffixed.h that will be #include'd above. Defining MAKEFIXED+ also defines BUILDFIXED, so the tables are built on the fly. main() writes+ those tables to stdout, which would directed to inffixed.h. Compile this+ along with zutil.c:++ cc -DMAKEFIXED -o fix inftrees.c zutil.c+ ./fix > inffixed.h+ */+int main(void) {+ unsigned low, size;+ struct inflate_state state;++ inflate_fixed(&state);+ puts("/* inffixed.h -- table for decoding fixed codes");+ puts(" * Generated automatically by makefixed().");+ puts(" */");+ puts("");+ puts("/* WARNING: this file should *not* be used by applications.");+ puts(" It is part of the implementation of this library and is");+ puts(" subject to change. Applications should only use zlib.h.");+ puts(" */");+ puts("");+ size = 1U << 9;+ printf("static const code lenfix[%u] = {", size);+ low = 0;+ for (;;) {+ if ((low % 7) == 0) printf("\n ");+ printf("{%u,%u,%d}", (low & 127) == 99 ? 64 : state.lencode[low].op,+ state.lencode[low].bits, state.lencode[low].val);+ if (++low == size) break;+ putchar(',');+ }+ puts("\n};");+ size = 1U << 5;+ printf("\nstatic const code distfix[%u] = {", size);+ low = 0;+ for (;;) {+ if ((low % 6) == 0) printf("\n ");+ printf("{%u,%u,%d}", state.distcode[low].op, state.distcode[low].bits,+ state.distcode[low].val);+ if (++low == size) break;+ putchar(',');+ }+ puts("\n};");+ return 0;+}+#endif /* MAKEFIXED */
cbits/inftrees.h view
@@ -1,5 +1,5 @@ /* inftrees.h -- header to use inftrees.c- * Copyright (C) 1995-2005, 2010 Mark Adler+ * Copyright (C) 1995-2026 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -60,3 +60,5 @@ int ZLIB_INTERNAL inflate_table(codetype type, unsigned short FAR *lens, unsigned codes, code FAR * FAR *table, unsigned FAR *bits, unsigned short FAR *work);+struct inflate_state;+void ZLIB_INTERNAL inflate_fixed(struct inflate_state FAR *state);
cbits/trees.c view
@@ -1,5 +1,5 @@ /* trees.c -- output deflated data using Huffman coding- * Copyright (C) 1995-2024 Jean-loup Gailly+ * Copyright (C) 1995-2026 Jean-loup Gailly * detect_data_type() function provided freely by Cosmin Truta, 2006 * For conditions of distribution and use, see copyright notice in zlib.h */@@ -112,7 +112,7 @@ #else # include "trees.h"-#endif /* GEN_TREES_H */+#endif /* defined(GEN_TREES_H) || !defined(STDC) */ struct static_tree_desc_s { const ct_data *static_tree; /* static tree or NULL */@@ -152,7 +152,7 @@ * IN assertion: 1 <= len <= 15 */ local unsigned bi_reverse(unsigned code, int len) {- register unsigned res = 0;+ unsigned res = 0; do { res |= code & 1; code >>= 1, res <<= 1;@@ -184,10 +184,11 @@ } else if (s->bi_valid > 0) { put_byte(s, (Byte)s->bi_buf); }+ s->bi_used = ((s->bi_valid - 1) & 7) + 1; s->bi_buf = 0; s->bi_valid = 0; #ifdef ZLIB_DEBUG- s->bits_sent = (s->bits_sent + 7) & ~7;+ s->bits_sent = (s->bits_sent + 7) & ~(ulg)7; #endif } @@ -466,6 +467,7 @@ s->bi_buf = 0; s->bi_valid = 0;+ s->bi_used = 0; #ifdef ZLIB_DEBUG s->compressed_len = 0L; s->bits_sent = 0L;@@ -724,7 +726,7 @@ if (++count < max_count && curlen == nextlen) { continue; } else if (count < min_count) {- s->bl_tree[curlen].Freq += count;+ s->bl_tree[curlen].Freq += (ush)count; } else if (curlen != 0) { if (curlen != prevlen) s->bl_tree[curlen].Freq++; s->bl_tree[REP_3_6].Freq++;@@ -817,7 +819,7 @@ } /* Update opt_len to include the bit length tree and counts */ s->opt_len += 3*((ulg)max_blindex + 1) + 5 + 5 + 4;- Tracev((stderr, "\ndyn trees: dyn %ld, stat %ld",+ Tracev((stderr, "\ndyn trees: dyn %lu, stat %lu", s->opt_len, s->static_len)); return max_blindex;@@ -843,13 +845,13 @@ Tracev((stderr, "\nbl code %2d ", bl_order[rank])); send_bits(s, s->bl_tree[bl_order[rank]].Len, 3); }- Tracev((stderr, "\nbl tree: sent %ld", s->bits_sent));+ Tracev((stderr, "\nbl tree: sent %lu", s->bits_sent)); send_tree(s, (ct_data *)s->dyn_ltree, lcodes - 1); /* literal tree */- Tracev((stderr, "\nlit tree: sent %ld", s->bits_sent));+ Tracev((stderr, "\nlit tree: sent %lu", s->bits_sent)); send_tree(s, (ct_data *)s->dyn_dtree, dcodes - 1); /* distance tree */- Tracev((stderr, "\ndist tree: sent %ld", s->bits_sent));+ Tracev((stderr, "\ndist tree: sent %lu", s->bits_sent)); } /* ===========================================================================@@ -932,7 +934,7 @@ extra = extra_dbits[code]; if (extra != 0) { dist -= (unsigned)base_dist[code];- send_bits(s, dist, extra); /* send the extra distance bits */+ send_bits(s, (int)dist, extra); /* send the extra bits */ } } /* literal or match pair ? */ @@ -1006,11 +1008,11 @@ /* Construct the literal and distance trees */ build_tree(s, (tree_desc *)(&(s->l_desc)));- Tracev((stderr, "\nlit data: dyn %ld, stat %ld", s->opt_len,+ Tracev((stderr, "\nlit data: dyn %lu, stat %lu", s->opt_len, s->static_len)); build_tree(s, (tree_desc *)(&(s->d_desc)));- Tracev((stderr, "\ndist data: dyn %ld, stat %ld", s->opt_len,+ Tracev((stderr, "\ndist data: dyn %lu, stat %lu", s->opt_len, s->static_len)); /* At this point, opt_len and static_len are the total bit lengths of * the compressed block data, excluding the tree representations.@@ -1083,7 +1085,7 @@ #endif } Tracev((stderr,"\ncomprlen %lu(%lu) ", s->compressed_len >> 3,- s->compressed_len - 7*last));+ s->compressed_len - 7*(ulg)last)); } /* ===========================================================================
cbits/uncompr.c view
@@ -1,5 +1,5 @@ /* uncompr.c -- decompress a memory buffer- * Copyright (C) 1995-2003, 2010, 2014, 2016 Jean-loup Gailly, Mark Adler+ * Copyright (C) 1995-2026 Jean-loup Gailly, Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -23,24 +23,24 @@ 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.++ The _z versions of the functions take size_t length arguments. */-int ZEXPORT uncompress2(Bytef *dest, uLongf *destLen, const Bytef *source,- uLong *sourceLen) {+int ZEXPORT uncompress2_z(Bytef *dest, z_size_t *destLen, const Bytef *source,+ z_size_t *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 */+ z_size_t len, left; + if (sourceLen == NULL || (*sourceLen > 0 && source == NULL) ||+ destLen == NULL || (*destLen > 0 && dest == NULL))+ return Z_STREAM_ERROR;+ len = *sourceLen;- if (*destLen) {- left = *destLen;- *destLen = 0;- }- else {- left = 1;- dest = buf;- }+ left = *destLen;+ if (left == 0 && dest == Z_NULL)+ dest = (Bytef *)&stream.reserved; /* next_out cannot be NULL */ stream.next_in = (z_const Bytef *)source; stream.avail_in = 0;@@ -56,30 +56,46 @@ do { if (stream.avail_out == 0) {- stream.avail_out = left > (uLong)max ? max : (uInt)left;+ stream.avail_out = left > (z_size_t)max ? max : (uInt)left; left -= stream.avail_out; } if (stream.avail_in == 0) {- stream.avail_in = len > (uLong)max ? max : (uInt)len;+ stream.avail_in = len > (z_size_t)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;+ /* Set len and left to the unused input data and unused output space. Set+ *sourceLen to the amount of input consumed. Set *destLen to the amount+ of data produced. */+ len += stream.avail_in;+ left += stream.avail_out;+ *sourceLen -= len;+ *destLen -= left; 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 == Z_BUF_ERROR && len == 0 ? Z_DATA_ERROR : err; }-+int ZEXPORT uncompress2(Bytef *dest, uLongf *destLen, const Bytef *source,+ uLong *sourceLen) {+ int ret;+ z_size_t got = *destLen, used = *sourceLen;+ ret = uncompress2_z(dest, &got, source, &used);+ *sourceLen = (uLong)used;+ *destLen = (uLong)got;+ return ret;+}+int ZEXPORT uncompress_z(Bytef *dest, z_size_t *destLen, const Bytef *source,+ z_size_t sourceLen) {+ z_size_t used = sourceLen;+ return uncompress2_z(dest, destLen, source, &used);+} int ZEXPORT uncompress(Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen) {- return uncompress2(dest, destLen, source, &sourceLen);+ uLong used = sourceLen;+ return uncompress2(dest, destLen, source, &used); }
cbits/zconf.h view
@@ -1,5 +1,5 @@ /* zconf.h -- configuration of the zlib compression library- * Copyright (C) 1995-2024 Jean-loup Gailly, Mark Adler+ * Copyright (C) 1995-2026 Jean-loup Gailly, Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -33,7 +33,10 @@ # ifndef Z_SOLO # define compress z_compress # define compress2 z_compress2+# define compress_z z_compress_z+# define compress2_z z_compress2_z # define compressBound z_compressBound+# define compressBound_z z_compressBound_z # endif # define crc32 z_crc32 # define crc32_combine z_crc32_combine@@ -44,6 +47,7 @@ # define crc32_z z_crc32_z # define deflate z_deflate # define deflateBound z_deflateBound+# define deflateBound_z z_deflateBound_z # define deflateCopy z_deflateCopy # define deflateEnd z_deflateEnd # define deflateGetDictionary z_deflateGetDictionary@@ -59,6 +63,7 @@ # define deflateSetDictionary z_deflateSetDictionary # define deflateSetHeader z_deflateSetHeader # define deflateTune z_deflateTune+# define deflateUsed z_deflateUsed # define deflate_copyright z_deflate_copyright # define get_crc_table z_get_crc_table # ifndef Z_SOLO@@ -128,9 +133,12 @@ # define inflate_copyright z_inflate_copyright # define inflate_fast z_inflate_fast # define inflate_table z_inflate_table+# define inflate_fixed z_inflate_fixed # ifndef Z_SOLO # define uncompress z_uncompress # define uncompress2 z_uncompress2+# define uncompress_z z_uncompress_z+# define uncompress2_z z_uncompress2_z # endif # define zError z_zError # ifndef Z_SOLO@@ -234,10 +242,12 @@ # endif #endif -#if defined(ZLIB_CONST) && !defined(z_const)-# define z_const const-#else-# define z_const+#ifndef z_const+# ifdef ZLIB_CONST+# define z_const const+# else+# define z_const+# endif #endif #ifdef Z_SOLO@@ -433,11 +443,11 @@ typedef unsigned long z_crc_t; #endif -#ifdef HAVE_UNISTD_H /* may be set to #if 1 by ./configure */+#if HAVE_UNISTD_H-0 /* may be set to #if 1 by ./configure */ # define Z_HAVE_UNISTD_H #endif -#ifdef HAVE_STDARG_H /* may be set to #if 1 by ./configure */+#if HAVE_STDARG_H-0 /* may be set to #if 1 by ./configure */ # define Z_HAVE_STDARG_H #endif @@ -470,12 +480,8 @@ #endif #ifndef Z_HAVE_UNISTD_H-# ifdef __WATCOMC__-# define Z_HAVE_UNISTD_H-# endif-#endif-#ifndef Z_HAVE_UNISTD_H-# if defined(_LARGEFILE64_SOURCE) && !defined(_WIN32)+# if defined(__WATCOMC__) || defined(__GO32__) || \+ (defined(_LARGEFILE64_SOURCE) && !defined(_WIN32)) # define Z_HAVE_UNISTD_H # endif #endif@@ -510,17 +516,19 @@ #endif #ifndef z_off_t-# define z_off_t long+# define z_off_t long long #endif #if !defined(_WIN32) && defined(Z_LARGE64) # define z_off64_t off64_t+#elif defined(__MINGW32__)+# define z_off64_t long long+#elif defined(_WIN32) && !defined(__GNUC__)+# define z_off64_t __int64+#elif defined(__GO32__)+# define z_off64_t offset_t #else-# if defined(_WIN32) && !defined(__GNUC__)-# define z_off64_t __int64-# else-# define z_off64_t z_off_t-# endif+# define z_off64_t z_off_t #endif /* MVS linker does not support external names larger than 8 bytes */
cbits/zlib.h view
@@ -1,7 +1,7 @@ /* zlib.h -- interface of the 'zlib' general purpose compression library- version 1.3.1, January 22nd, 2024+ version 1.3.2, February 17th, 2026 - Copyright (C) 1995-2024 Jean-loup Gailly and Mark Adler+ Copyright (C) 1995-2026 Jean-loup Gailly and Mark Adler This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages@@ -24,24 +24,28 @@ The data format used by the zlib library is described by RFCs (Request for- Comments) 1950 to 1952 in the files http://tools.ietf.org/html/rfc1950+ Comments) 1950 to 1952 at https://datatracker.ietf.org/doc/html/rfc1950 (zlib format), rfc1951 (deflate format) and rfc1952 (gzip format). */ #ifndef ZLIB_H #define ZLIB_H -#include "zconf.h"+#ifdef ZLIB_BUILD+# include <zconf.h>+#else+# include "zconf.h"+#endif #ifdef __cplusplus extern "C" { #endif -#define ZLIB_VERSION "1.3.1"-#define ZLIB_VERNUM 0x1310+#define ZLIB_VERSION "1.3.2"+#define ZLIB_VERNUM 0x1320 #define ZLIB_VER_MAJOR 1 #define ZLIB_VER_MINOR 3-#define ZLIB_VER_REVISION 1+#define ZLIB_VER_REVISION 2 #define ZLIB_VER_SUBREVISION 0 /*@@ -441,7 +445,7 @@ The Z_BLOCK option assists in appending to or combining deflate streams. To assist in this, on return inflate() always sets strm->data_type to the- number of unused bits in the last byte taken from strm->next_in, plus 64 if+ number of unused bits in the input taken from strm->next_in, plus 64 if inflate() is currently decoding the last block in the deflate stream, plus 128 if inflate() returned immediately after decoding an end-of-block code or decoding the complete header up to just before the first byte of the deflate@@ -587,18 +591,21 @@ The strategy parameter is used to tune the compression algorithm. Use the value Z_DEFAULT_STRATEGY for normal data, Z_FILTERED for data produced by a- filter (or predictor), Z_HUFFMAN_ONLY to force Huffman encoding only (no- string match), or Z_RLE to limit match distances to one (run-length- encoding). Filtered data consists mostly of small values with a somewhat- random distribution. In this case, the compression algorithm is tuned to- compress them better. The effect of Z_FILTERED is to force more Huffman- coding and less string matching; it is somewhat intermediate between- Z_DEFAULT_STRATEGY and Z_HUFFMAN_ONLY. Z_RLE is designed to be almost as- fast as Z_HUFFMAN_ONLY, but give better compression for PNG image data. The- strategy parameter only affects the compression ratio but not the- correctness of the compressed output even if it is not set appropriately.- Z_FIXED prevents the use of dynamic Huffman codes, allowing for a simpler- decoder for special applications.+ filter (or predictor), Z_RLE to limit match distances to one (run-length+ encoding), or Z_HUFFMAN_ONLY to force Huffman encoding only (no string+ matching). Filtered data consists mostly of small values with a somewhat+ random distribution, as produced by the PNG filters. In this case, the+ compression algorithm is tuned to compress them better. The effect of+ Z_FILTERED is to force more Huffman coding and less string matching than the+ default; it is intermediate between Z_DEFAULT_STRATEGY and Z_HUFFMAN_ONLY.+ Z_RLE is almost as fast as Z_HUFFMAN_ONLY, but should give better+ compression for PNG image data than Huffman only. The degree of string+ matching from most to none is: Z_DEFAULT_STRATEGY, Z_FILTERED, Z_RLE, then+ Z_HUFFMAN_ONLY. The strategy parameter affects the compression ratio but+ never the correctness of the compressed output, even if it is not set+ optimally for the given data. Z_FIXED uses the default string matching, but+ prevents the use of dynamic Huffman codes, allowing for a simpler decoder+ for special applications. deflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_STREAM_ERROR if any parameter is invalid (such as an invalid@@ -758,8 +765,8 @@ returns Z_OK on success, or Z_STREAM_ERROR for an invalid deflate stream. */ -ZEXTERN uLong ZEXPORT deflateBound(z_streamp strm,- uLong sourceLen);+ZEXTERN uLong ZEXPORT deflateBound(z_streamp strm, uLong sourceLen);+ZEXTERN z_size_t ZEXPORT deflateBound_z(z_streamp strm, z_size_t sourceLen); /* deflateBound() returns an upper bound on the compressed size after deflation of sourceLen bytes. It must be called after deflateInit() or@@ -771,6 +778,9 @@ to return Z_STREAM_END. Note that it is possible for the compressed size to be larger than the value returned by deflateBound() if flush options other than Z_FINISH or Z_NO_FLUSH are used.++ delfateBound_z() is the same, but takes and returns a size_t length. Note+ that a long is 32 bits on Windows. */ ZEXTERN int ZEXPORT deflatePending(z_streamp strm,@@ -785,6 +795,21 @@ or bits are Z_NULL, then those values are not set. deflatePending returns Z_OK if success, or Z_STREAM_ERROR if the source+ stream state was inconsistent. If an int is 16 bits and memLevel is 9, then+ it is possible for the number of pending bytes to not fit in an unsigned. In+ that case Z_BUF_ERROR is returned and *pending is set to the maximum value+ of an unsigned.+ */++ZEXTERN int ZEXPORT deflateUsed(z_streamp strm,+ int *bits);+/*+ deflateUsed() returns in *bits the most recent number of deflate bits used+ in the last byte when flushing to a byte boundary. The result is in 1..8, or+ 0 if there has not yet been a flush. This helps determine the location of+ the last bit of a deflate stream.++ deflateUsed returns Z_OK if success, or Z_STREAM_ERROR if the source stream state was inconsistent. */ @@ -987,13 +1012,15 @@ int bits, int value); /*- This function inserts bits in the inflate input stream. The intent is- that this function is used to start inflating at a bit position in the- middle of a byte. The provided bits will be used before any bytes are used- from next_in. This function should only be used with raw inflate, and- should be used before the first inflate() call after inflateInit2() or- inflateReset(). bits must be less than or equal to 16, and that many of the- least significant bits of value will be inserted in the input.+ This function inserts bits in the inflate input stream. The intent is to+ use inflatePrime() to start inflating at a bit position in the middle of a+ byte. The provided bits will be used before any bytes are used from+ next_in. This function should be used with raw inflate, before the first+ inflate() call, after inflateInit2() or inflateReset(). It can also be used+ after an inflate() return indicates the end of a deflate block or header+ when using Z_BLOCK. bits must be less than or equal to 16, and that many of+ the least significant bits of value will be inserted in the input. The+ other bits in value can be non-zero, and will be ignored. If bits is negative, then the input stream bit buffer is emptied. Then inflatePrime() can be called again to put bits in the buffer. This is used@@ -1001,7 +1028,15 @@ to feeding inflate codes. inflatePrime returns Z_OK if success, or Z_STREAM_ERROR if the source- stream state was inconsistent.+ stream state was inconsistent, or if bits is out of range. If inflate was+ in the middle of processing a header, trailer, or stored block lengths, then+ it is possible for there to be only eight bits available in the bit buffer.+ In that case, bits > 8 is considered out of range. However, when used as+ outlined above, there will always be 16 bits available in the buffer for+ insertion. As noted in its documentation above, inflate records the number+ of bits in the bit buffer on return in data_type. 32 minus that is the+ number of bits available for insertion. inflatePrime does not update+ data_type with the new number of bits in buffer. */ ZEXTERN long ZEXPORT inflateMark(z_streamp strm);@@ -1047,20 +1082,22 @@ The text, time, xflags, and os fields are filled in with the gzip header contents. hcrc is set to true if there is a header CRC. (The header CRC- was valid if done is set to one.) If extra is not Z_NULL, then extra_max- contains the maximum number of bytes to write to extra. Once done is true,- extra_len contains the actual extra field length, and extra contains the- extra field, or that field truncated if extra_max is less than extra_len.- If name is not Z_NULL, then up to name_max characters are written there,- terminated with a zero unless the length is greater than name_max. If- comment is not Z_NULL, then up to comm_max characters are written there,- terminated with a zero unless the length is greater than comm_max. When any- of extra, name, or comment are not Z_NULL and the respective field is not- present in the header, then that field is set to Z_NULL to signal its- absence. This allows the use of deflateSetHeader() with the returned- structure to duplicate the header. However if those fields are set to- allocated memory, then the application will need to save those pointers- elsewhere so that they can be eventually freed.+ was valid if done is set to one.) The extra, name, and comment pointers+ much each be either Z_NULL or point to space to store that information from+ the header. If extra is not Z_NULL, then extra_max contains the maximum+ number of bytes that can be written to extra. Once done is true, extra_len+ contains the actual extra field length, and extra contains the extra field,+ or that field truncated if extra_max is less than extra_len. If name is not+ Z_NULL, then up to name_max characters, including the terminating zero, are+ written there. If comment is not Z_NULL, then up to comm_max characters,+ including the terminating zero, are written there. The application can tell+ that the name or comment did not fit in the provided space by the absence of+ a terminating zero. If any of extra, name, or comment are not present in+ the header, then that field's pointer is set to Z_NULL. This allows the use+ of deflateSetHeader() with the returned structure to duplicate the header.+ Note that if those fields initially pointed to allocated memory, then the+ application will need to save them elsewhere so that they can be eventually+ freed. If inflateGetHeader is not used, then the header information is simply discarded. The header is always checked for validity, including the header@@ -1208,13 +1245,14 @@ 21: FASTEST -- deflate algorithm with only one, lowest compression level 22,23: 0 (reserved) - The sprintf variant used by gzprintf (zero is best):+ The sprintf variant used by gzprintf (all zeros is best): 24: 0 = vs*, 1 = s* -- 1 means limited to 20 arguments after the format- 25: 0 = *nprintf, 1 = *printf -- 1 means gzprintf() not secure!+ 25: 0 = *nprintf, 1 = *printf -- 1 means gzprintf() is not secure! 26: 0 = returns value, 1 = void -- 1 means inferred string length returned+ 27: 0 = gzprintf() present, 1 = not -- 1 means gzprintf() returns an error Remainder:- 27-31: 0 (reserved)+ 28-31: 0 (reserved) */ #ifndef Z_SOLO@@ -1226,11 +1264,14 @@ stream-oriented functions. To simplify the interface, some default options are assumed (compression level and memory usage, standard memory allocation functions). The source code of these utility functions can be modified if- you need special options.+ you need special options. The _z versions of the functions use the size_t+ type for lengths. Note that a long is 32 bits on Windows. */ -ZEXTERN int ZEXPORT compress(Bytef *dest, uLongf *destLen,+ZEXTERN int ZEXPORT compress(Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen);+ZEXTERN int ZEXPORT compress_z(Bytef *dest, z_size_t *destLen,+ const Bytef *source, z_size_t sourceLen); /* Compresses the source buffer into the destination buffer. sourceLen is the byte length of the source buffer. Upon entry, destLen is the total size@@ -1244,9 +1285,12 @@ buffer. */ -ZEXTERN int ZEXPORT compress2(Bytef *dest, uLongf *destLen,+ZEXTERN int ZEXPORT compress2(Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen, int level);+ZEXTERN int ZEXPORT compress2_z(Bytef *dest, z_size_t *destLen,+ const Bytef *source, z_size_t sourceLen,+ int level); /* Compresses the source buffer into the destination buffer. The level parameter has the same meaning as in deflateInit. sourceLen is the byte@@ -1261,21 +1305,24 @@ */ ZEXTERN uLong ZEXPORT compressBound(uLong sourceLen);+ZEXTERN z_size_t ZEXPORT compressBound_z(z_size_t sourceLen); /* compressBound() returns an upper bound on the compressed size after compress() or compress2() on sourceLen bytes. It would be used before a compress() or compress2() call to allocate the destination buffer. */ -ZEXTERN int ZEXPORT uncompress(Bytef *dest, uLongf *destLen,+ZEXTERN int ZEXPORT uncompress(Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen);+ZEXTERN int ZEXPORT uncompress_z(Bytef *dest, z_size_t *destLen,+ const Bytef *source, z_size_t sourceLen); /* Decompresses the source buffer into the destination buffer. sourceLen is- the byte length of the source buffer. Upon entry, destLen is the total size+ the byte length of the source buffer. On 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+ mechanism outside the scope of this compression library.) On exit, *destLen is the actual size of the uncompressed data. uncompress returns Z_OK if success, Z_MEM_ERROR if there was not@@ -1285,8 +1332,10 @@ buffer with the uncompressed data up to that point. */ -ZEXTERN int ZEXPORT uncompress2(Bytef *dest, uLongf *destLen,+ZEXTERN int ZEXPORT uncompress2(Bytef *dest, uLongf *destLen, const Bytef *source, uLong *sourceLen);+ZEXTERN int ZEXPORT uncompress2_z(Bytef *dest, z_size_t *destLen,+ const Bytef *source, z_size_t *sourceLen); /* Same as uncompress, except that sourceLen is a pointer, where the length of the source is *sourceLen. On return, *sourceLen is the number of@@ -1314,13 +1363,17 @@ 'R' for run-length encoding as in "wb1R", or 'F' for fixed code compression as in "wb9F". (See the description of deflateInit2 for more information about the strategy parameter.) 'T' will request transparent writing or- appending with no compression and not using the gzip format.+ appending with no compression and not using the gzip format. 'T' cannot be+ used to force transparent reading. Transparent reading is automatically+ performed if there is no gzip header at the start. Transparent reading can+ be disabled with the 'G' option, which will instead return an error if there+ is no gzip header. 'N' will open the file in non-blocking mode. - "a" can be used instead of "w" to request that the gzip stream that will- be written be appended to the file. "+" will result in an error, since+ 'a' can be used instead of 'w' to request that the gzip stream that will+ be written be appended to the file. '+' will result in an error, since reading and writing to the same gzip file is not supported. The addition of- "x" when writing will create the file exclusively, which fails if the file- already exists. On systems that support it, the addition of "e" when+ 'x' when writing will create the file exclusively, which fails if the file+ already exists. On systems that support it, the addition of 'e' when reading or writing will set the flag to close the file on an execve() call. These functions, as well as gzip, will read and decode a sequence of gzip@@ -1339,14 +1392,22 @@ insufficient memory to allocate the gzFile state, or if an invalid mode was specified (an 'r', 'w', or 'a' was not provided, or '+' was provided). errno can be checked to determine if the reason gzopen failed was that the- file could not be opened.+ file could not be opened. Note that if 'N' is in mode for non-blocking, the+ open() itself can fail in order to not block. In that case gzopen() will+ return NULL and errno will be EAGAIN or ENONBLOCK. The call to gzopen() can+ then be re-tried. If the application would like to block on opening the+ file, then it can use open() without O_NONBLOCK, and then gzdopen() with the+ resulting file descriptor and 'N' in the mode, which will set it to non-+ blocking. */ ZEXTERN gzFile ZEXPORT gzdopen(int fd, const char *mode); /* Associate a gzFile with the file descriptor fd. File descriptors are obtained from calls like open, dup, creat, pipe or fileno (if the file has- been previously opened with fopen). The mode parameter is as in gzopen.+ been previously opened with fopen). The mode parameter is as in gzopen. An+ 'e' in mode will set fd's flag to close the file on an execve() call. An 'N'+ in mode will set fd's non-blocking flag. The next call of gzclose on the returned gzFile will also close the file descriptor fd, just like fclose(fdopen(fd, mode)) closes the file descriptor@@ -1416,10 +1477,16 @@ stream. Alternatively, gzerror can be used before gzclose to detect this case. + gzread can be used to read a gzip file on a non-blocking device. If the+ input stalls and there is no uncompressed data to return, then gzread() will+ return -1, and errno will be EAGAIN or EWOULDBLOCK. gzread() can then be+ called again.+ gzread returns the number of uncompressed bytes actually read, less than len for end of file, or -1 for error. If len is too large to fit in an int, then nothing is read, -1 is returned, and the error state is set to- Z_STREAM_ERROR.+ Z_STREAM_ERROR. If some data was read before an error, then that data is+ returned until exhausted, after which the next call will signal the error. */ ZEXTERN z_size_t ZEXPORT gzfread(voidp buf, z_size_t size, z_size_t nitems,@@ -1443,15 +1510,20 @@ multiple of size, then the final partial item is nevertheless read into buf and the end-of-file flag is set. The length of the partial item read is not provided, but could be inferred from the result of gztell(). This behavior- is the same as the behavior of fread() implementations in common libraries,- but it prevents the direct use of gzfread() to read a concurrently written- file, resetting and retrying on end-of-file, when size is not 1.+ is the same as that of fread() implementations in common libraries. This+ could result in data loss if used with size != 1 when reading a concurrently+ written file or a non-blocking file. In that case, use size == 1 or gzread()+ instead. */ ZEXTERN int ZEXPORT gzwrite(gzFile file, voidpc buf, unsigned len); /* Compress and write the len uncompressed bytes at buf to file. gzwrite- returns the number of uncompressed bytes written or 0 in case of error.+ returns the number of uncompressed bytes written, or 0 in case of error or+ if len is 0. If the write destination is non-blocking, then gzwrite() may+ return a number of bytes written that is not 0 and less than len.++ If len does not fit in an int, then 0 is returned and nothing is written. */ ZEXTERN z_size_t ZEXPORT gzfwrite(voidpc buf, z_size_t size,@@ -1466,9 +1538,18 @@ if there was an error. If the multiplication of size and nitems overflows, i.e. the product does not fit in a z_size_t, then nothing is written, zero is returned, and the error state is set to Z_STREAM_ERROR.++ If writing a concurrently read file or a non-blocking file with size != 1,+ a partial item could be written, with no way of knowing how much of it was+ not written, resulting in data loss. In that case, use size == 1 or+ gzwrite() instead. */ +#if defined(STDC) || defined(Z_HAVE_STDARG_H) ZEXTERN int ZEXPORTVA gzprintf(gzFile file, const char *format, ...);+#else+ZEXTERN int ZEXPORTVA gzprintf();+#endif /* Convert, format, compress, and write the arguments (...) to file under control of the string format, as in fprintf. gzprintf returns the number of@@ -1476,11 +1557,19 @@ of error. The number of uncompressed bytes written is limited to 8191, or one less than the buffer size given to gzbuffer(). The caller should assure that this limit is not exceeded. If it is exceeded, then gzprintf() will- return an error (0) with nothing written. In this case, there may also be a- buffer overflow with unpredictable consequences, which is possible only if- zlib was compiled with the insecure functions sprintf() or vsprintf(),- because the secure snprintf() or vsnprintf() functions were not available.- This can be determined using zlibCompileFlags().+ return an error (0) with nothing written.++ In that last case, there may also be a buffer overflow with unpredictable+ consequences, which is possible only if zlib was compiled with the insecure+ functions sprintf() or vsprintf(), because the secure snprintf() and+ vsnprintf() functions were not available. That would only be the case for+ a non-ANSI C compiler. zlib may have been built without gzprintf() because+ secure functions were not available and having gzprintf() be insecure was+ not an option, in which case, gzprintf() returns Z_STREAM_ERROR. All of+ these possibilities can be determined using zlibCompileFlags().++ If a Z_BUF_ERROR is returned, then nothing was written due to a stall on+ the non-blocking write destination. */ ZEXTERN int ZEXPORT gzputs(gzFile file, const char *s);@@ -1489,6 +1578,11 @@ the terminating null character. gzputs returns the number of characters written, or -1 in case of error.+ The number of characters written may be less than the length of the string+ if the write destination is non-blocking.++ If the length of the string does not fit in an int, then -1 is returned+ and nothing is written. */ ZEXTERN char * ZEXPORT gzgets(gzFile file, char *buf, int len);@@ -1501,8 +1595,13 @@ left untouched. gzgets returns buf which is a null-terminated string, or it returns NULL- for end-of-file or in case of error. If there was an error, the contents at- buf are indeterminate.+ for end-of-file or in case of error. If some data was read before an error,+ then that data is returned until exhausted, after which the next call will+ return NULL to signal the error.++ gzgets can be used on a file being concurrently written, and on a non-+ blocking device, both as for gzread(). However lines may be broken in the+ middle, leaving it up to the application to reassemble them as needed. */ ZEXTERN int ZEXPORT gzputc(gzFile file, int c);@@ -1513,11 +1612,19 @@ ZEXTERN int ZEXPORT gzgetc(gzFile file); /*- Read and decompress one byte from file. gzgetc returns this byte or -1- in case of end of file or error. This is implemented as a macro for speed.- As such, it does not do all of the checking the other functions do. I.e.- it does not check to see if file is NULL, nor whether the structure file- points to has been clobbered or not.+ Read and decompress one byte from file. gzgetc returns this byte or -1 in+ case of end of file or error. If some data was read before an error, then+ that data is returned until exhausted, after which the next call will return+ -1 to signal the error.++ This is implemented as a macro for speed. As such, it does not do all of+ the checking the other functions do. I.e. it does not check to see if file+ is NULL, nor whether the structure file points to has been clobbered or not.++ gzgetc can be used to read a gzip file on a non-blocking device. If the+ input stalls and there is no uncompressed data to return, then gzgetc() will+ return -1, and errno will be EAGAIN or EWOULDBLOCK. gzread() can then be+ called again. */ ZEXTERN int ZEXPORT gzungetc(int c, gzFile file);@@ -1530,6 +1637,11 @@ output buffer size of pushed characters is allowed. (See gzbuffer above.) The pushed character will be discarded if the stream is repositioned with gzseek() or gzrewind().++ gzungetc(-1, file) will force any pending seek to execute. Then gztell()+ will report the position, even if the requested seek reached end of file.+ This can be used to determine the number of uncompressed bytes in a gzip+ file without having to read it into a buffer. */ ZEXTERN int ZEXPORT gzflush(gzFile file, int flush);@@ -1559,7 +1671,8 @@ If the file is opened for reading, this function is emulated but can be extremely slow. If the file is opened for writing, only forward seeks are supported; gzseek then compresses a sequence of zeroes up to the new- starting position.+ starting position. For reading or writing, any actual seeking is deferred+ until the next read or write operation, or close operation when writing. gzseek returns the resulting offset location as measured in bytes from the beginning of the uncompressed stream, or -1 in case of error, in@@ -1567,7 +1680,7 @@ would be before the current position. */ -ZEXTERN int ZEXPORT gzrewind(gzFile file);+ZEXTERN int ZEXPORT gzrewind(gzFile file); /* Rewind file. This function is supported only for reading. @@ -1575,7 +1688,7 @@ */ /*-ZEXTERN z_off_t ZEXPORT gztell(gzFile file);+ZEXTERN z_off_t ZEXPORT gztell(gzFile file); Return the starting position for the next gzread or gzwrite on file. This position represents a number of bytes in the uncompressed data stream,@@ -1620,8 +1733,11 @@ If gzdirect() is used immediately after gzopen() or gzdopen() it will cause buffers to be allocated to allow reading the file to determine if it- is a gzip file. Therefore if gzbuffer() is used, it should be called before- gzdirect().+ is a gzip file. Therefore if gzbuffer() is used, it should be called before+ gzdirect(). If the input is being written concurrently or the device is non-+ blocking, then gzdirect() may give a different answer once four bytes of+ input have been accumulated, which is what is needed to confirm or deny a+ gzip header. Before this, gzdirect() will return true (1). When writing, gzdirect() returns true (1) if transparent writing was requested ("wT" for the gzopen() mode), or false (0) otherwise. (Note:@@ -1631,7 +1747,7 @@ gzip file reading and decompression, which may not be desired.) */ -ZEXTERN int ZEXPORT gzclose(gzFile file);+ZEXTERN int ZEXPORT gzclose(gzFile file); /* Flush all pending output for file, if necessary, close file and deallocate the (de)compression state. Note that once file is closed, you@@ -1659,9 +1775,10 @@ ZEXTERN const char * ZEXPORT gzerror(gzFile file, int *errnum); /* Return the error message for the last error which occurred on file.- errnum is set to zlib error number. If an error occurred in the file system- and not in the compression library, errnum is set to Z_ERRNO and the- application may consult errno to get the exact error code.+ If errnum is not NULL, *errnum is set to zlib error number. If an error+ occurred in the file system and not in the compression library, *errnum is+ set to Z_ERRNO and the application may consult errno to get the exact error+ code. The application must not modify the returned string. Future calls to this function may invalidate the previously returned string. If file is@@ -1712,7 +1829,8 @@ ZEXTERN uLong ZEXPORT adler32_z(uLong adler, const Bytef *buf, z_size_t len); /*- Same as adler32(), but with a size_t length.+ Same as adler32(), but with a size_t length. Note that a long is 32 bits+ on Windows. */ /*@@ -1748,7 +1866,8 @@ ZEXTERN uLong ZEXPORT crc32_z(uLong crc, const Bytef *buf, z_size_t len); /*- Same as crc32(), but with a size_t length.+ Same as crc32(), but with a size_t length. Note that a long is 32 bits on+ Windows. */ /*@@ -1758,14 +1877,14 @@ seq1 and seq2 with lengths len1 and len2, CRC-32 check values were calculated for each, crc1 and crc2. crc32_combine() returns the CRC-32 check value of seq1 and seq2 concatenated, requiring only crc1, crc2, and- len2. len2 must be non-negative.+ len2. len2 must be non-negative, otherwise zero is returned. */ /* ZEXTERN uLong ZEXPORT crc32_combine_gen(z_off_t len2); Return the operator corresponding to length len2, to be used with- crc32_combine_op(). len2 must be non-negative.+ crc32_combine_op(). len2 must be non-negative, otherwise zero is returned. */ ZEXTERN uLong ZEXPORT crc32_combine_op(uLong crc1, uLong crc2, uLong op);@@ -1888,9 +2007,9 @@ ZEXTERN z_off_t ZEXPORT gzseek64(gzFile, z_off_t, int); ZEXTERN z_off_t ZEXPORT gztell64(gzFile); ZEXTERN z_off_t ZEXPORT gzoffset64(gzFile);- ZEXTERN uLong ZEXPORT adler32_combine64(uLong, uLong, z_off_t);- ZEXTERN uLong ZEXPORT crc32_combine64(uLong, uLong, z_off_t);- ZEXTERN uLong ZEXPORT crc32_combine_gen64(z_off_t);+ ZEXTERN uLong ZEXPORT adler32_combine64(uLong, uLong, z_off64_t);+ ZEXTERN uLong ZEXPORT crc32_combine64(uLong, uLong, z_off64_t);+ ZEXTERN uLong ZEXPORT crc32_combine_gen64(z_off64_t); # endif #else ZEXTERN gzFile ZEXPORT gzopen(const char *, const char *);
cbits/zutil.c view
@@ -1,5 +1,5 @@ /* zutil.c -- target dependent utility functions for the compression library- * Copyright (C) 1995-2017 Jean-loup Gailly+ * Copyright (C) 1995-2026 Jean-loup Gailly * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -86,28 +86,36 @@ flags += 1L << 21; #endif #if defined(STDC) || defined(Z_HAVE_STDARG_H)-# ifdef NO_vsnprintf- flags += 1L << 25;-# ifdef HAS_vsprintf_void- flags += 1L << 26;-# endif-# else-# ifdef HAS_vsnprintf_void- flags += 1L << 26;-# endif-# endif+# ifdef NO_vsnprintf+# ifdef ZLIB_INSECURE+ flags += 1L << 25;+# else+ flags += 1L << 27;+# endif+# ifdef HAS_vsprintf_void+ flags += 1L << 26;+# endif+# else+# ifdef HAS_vsnprintf_void+ flags += 1L << 26;+# endif+# endif #else flags += 1L << 24;-# ifdef NO_snprintf- flags += 1L << 25;-# ifdef HAS_sprintf_void- flags += 1L << 26;-# endif-# else-# ifdef HAS_snprintf_void- flags += 1L << 26;-# endif-# endif+# ifdef NO_snprintf+# ifdef ZLIB_INSECURE+ flags += 1L << 25;+# else+ flags += 1L << 27;+# endif+# ifdef HAS_sprintf_void+ flags += 1L << 26;+# endif+# else+# ifdef HAS_snprintf_void+ flags += 1L << 26;+# endif+# endif #endif return flags; }@@ -142,28 +150,34 @@ #ifndef HAVE_MEMCPY -void ZLIB_INTERNAL zmemcpy(Bytef* dest, const Bytef* source, uInt len) {- if (len == 0) return;- do {- *dest++ = *source++; /* ??? to be unrolled */- } while (--len != 0);+void ZLIB_INTERNAL zmemcpy(void FAR *dst, const void FAR *src, z_size_t n) {+ uchf *p = dst;+ const uchf *q = src;+ while (n) {+ *p++ = *q++;+ n--;+ } } -int ZLIB_INTERNAL zmemcmp(const Bytef* s1, const Bytef* s2, uInt len) {- uInt j;-- for (j = 0; j < len; j++) {- if (s1[j] != s2[j]) return 2*(s1[j] > s2[j])-1;+int ZLIB_INTERNAL zmemcmp(const void FAR *s1, const void FAR *s2, z_size_t n) {+ const uchf *p = s1, *q = s2;+ while (n) {+ if (*p++ != *q++)+ return (int)p[-1] - (int)q[-1];+ n--; } return 0; } -void ZLIB_INTERNAL zmemzero(Bytef* dest, uInt len) {+void ZLIB_INTERNAL zmemzero(void FAR *b, z_size_t len) {+ uchf *p = b; if (len == 0) return;- do {- *dest++ = 0; /* ??? to be unrolled */- } while (--len != 0);+ while (len) {+ *p++ = 0;+ len--;+ } }+ #endif #ifndef Z_SOLO
cbits/zutil.h view
@@ -1,5 +1,5 @@ /* zutil.h -- internal interface and configuration of the compression library- * Copyright (C) 1995-2024 Jean-loup Gailly, Mark Adler+ * Copyright (C) 1995-2026 Jean-loup Gailly, Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -36,6 +36,10 @@ define "local" for the non-static meaning of "static", for readability (compile with -Dlocal if your debugger can't find static symbols) */ +extern const char deflate_copyright[];+extern const char inflate_copyright[];+extern const char inflate9_copyright[];+ typedef unsigned char uch; typedef uch FAR uchf; typedef unsigned short ush;@@ -48,6 +52,8 @@ # define Z_U8 unsigned long # elif (ULLONG_MAX == 0xffffffffffffffff) # define Z_U8 unsigned long long+# elif (ULONG_LONG_MAX == 0xffffffffffffffff)+# define Z_U8 unsigned long long # elif (UINT_MAX == 0xffffffffffffffff) # define Z_U8 unsigned # endif@@ -63,7 +69,9 @@ /* To be used only when the state is known to be valid */ /* common constants */-+#if MAX_WBITS < 9 || MAX_WBITS > 15+# error MAX_WBITS must be in 9..15+#endif #ifndef DEF_WBITS # define DEF_WBITS MAX_WBITS #endif@@ -141,7 +149,7 @@ # define OS_CODE 7 #endif -#ifdef __acorn+#if defined(__acorn) || defined(__riscos) # define OS_CODE 13 #endif @@ -168,11 +176,10 @@ #endif /* provide prototypes for these when building zlib without LFS */-#if !defined(_WIN32) && \- (!defined(_LARGEFILE64_SOURCE) || _LFS64_LARGEFILE-0 == 0)- ZEXTERN uLong ZEXPORT adler32_combine64(uLong, uLong, z_off_t);- ZEXTERN uLong ZEXPORT crc32_combine64(uLong, uLong, z_off_t);- ZEXTERN uLong ZEXPORT crc32_combine_gen64(z_off_t);+#ifndef Z_LARGE64+ ZEXTERN uLong ZEXPORT adler32_combine64(uLong, uLong, z_off64_t);+ ZEXTERN uLong ZEXPORT crc32_combine64(uLong, uLong, z_off64_t);+ ZEXTERN uLong ZEXPORT crc32_combine_gen64(z_off64_t); #endif /* common defaults */@@ -211,9 +218,9 @@ # define zmemzero(dest, len) memset(dest, 0, len) # endif #else- void ZLIB_INTERNAL zmemcpy(Bytef* dest, const Bytef* source, uInt len);- int ZLIB_INTERNAL zmemcmp(const Bytef* s1, const Bytef* s2, uInt len);- void ZLIB_INTERNAL zmemzero(Bytef* dest, uInt len);+ void ZLIB_INTERNAL zmemcpy(void FAR *, const void FAR *, z_size_t);+ int ZLIB_INTERNAL zmemcmp(const void FAR *, const void FAR *, z_size_t);+ void ZLIB_INTERNAL zmemzero(void FAR *, z_size_t); #endif /* Diagnostic functions */@@ -250,5 +257,75 @@ /* Reverse the bytes in a 32-bit value */ #define ZSWAP32(q) ((((q) >> 24) & 0xff) + (((q) >> 8) & 0xff00) + \ (((q) & 0xff00) << 8) + (((q) & 0xff) << 24))++#ifdef Z_ONCE+/*+ Create a local z_once() function depending on the availability of atomics.+ */++/* Check for the availability of atomics. */+#if defined(__STDC__) && __STDC_VERSION__ >= 201112L && \+ !defined(__STDC_NO_ATOMICS__)++#include <stdatomic.h>+typedef struct {+ atomic_flag begun;+ atomic_int done;+} z_once_t;+#define Z_ONCE_INIT {ATOMIC_FLAG_INIT, 0}++/*+ Run the provided init() function exactly once, even if multiple threads+ invoke once() at the same time. The state must be a once_t initialized with+ Z_ONCE_INIT.+ */+local void z_once(z_once_t *state, void (*init)(void)) {+ if (!atomic_load(&state->done)) {+ if (atomic_flag_test_and_set(&state->begun))+ while (!atomic_load(&state->done))+ ;+ else {+ init();+ atomic_store(&state->done, 1);+ }+ }+}++#else /* no atomics */++#warning zlib not thread-safe++typedef struct z_once_s {+ volatile int begun;+ volatile int done;+} z_once_t;+#define Z_ONCE_INIT {0, 0}++/* Test and set. Alas, not atomic, but tries to limit the period of+ vulnerability. */+local int test_and_set(int volatile *flag) {+ int was;++ was = *flag;+ *flag = 1;+ return was;+}++/* Run the provided init() function once. This is not thread-safe. */+local void z_once(z_once_t *state, void (*init)(void)) {+ if (!state->done) {+ if (test_and_set(&state->begun))+ while (!state->done)+ ;+ else {+ init();+ state->done = 1;+ }+ }+}++#endif /* ?atomics */++#endif /* Z_ONCE */ #endif /* ZUTIL_H */
changelog.md view
@@ -1,3 +1,7 @@+1.3.2 Bodigrim <andrew.lelechenko@gmail.com> May 2026++* update to zlib 1.3.2+ 1.3.1 Julian Ospald <hasufell@posteo> March 2024 * initial split off of zlib package
zlib-clib.cabal view
@@ -1,8 +1,8 @@ cabal-version: 2.4 name: zlib-clib-version: 1.3.1+version: 1.3.2 -copyright: 1995-2024 Jean-loup Gailly and Mark Adler+copyright: 1995-2026 Jean-loup Gailly and Mark Adler license: Zlib license-file: LICENSE maintainer: Duncan Coutts <duncan@community.haskell.org>, Andrew Lelechenko <andrew.lelechenko@gmail.com>, Emily Pillmore <emilypi@cohomolo.gy>, Herbert Valerio Riedel <hvr@gnu.org>@@ -24,9 +24,11 @@ , GHC == 9.0.2 , GHC == 9.2.8 , GHC == 9.4.8- , GHC == 9.6.5- , GHC == 9.8.2- , GHC == 9.10.1+ , GHC == 9.6.7+ , GHC == 9.8.4+ , GHC == 9.10.3+ , GHC == 9.12.2+ , GHC == 9.14.1 source-repository head type: git@@ -36,7 +38,6 @@ default-language: Haskell2010 include-dirs: cbits- includes: zlib.h c-sources: cbits/adler32.c cbits/compress.c@@ -62,4 +63,3 @@ gzguts.h zlib.h zconf.h-