From cbbd20302c6e3fb626bee5bd8b4932524049515c Mon Sep 17 00:00:00 2001 From: Mark Adler Date: Sun, 15 Jan 2017 08:22:16 -0800 Subject: [PATCH] Permit immediate deflateParams changes before any deflate input. This permits deflateParams to change the strategy and level right after deflateInit, without having to wait until a header has been written. The parameters can be changed immediately up until the first deflate call that consumes any input data. --- deflate.c | 3 ++- zlib.h | 9 +++++---- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/deflate.c b/deflate.c index 8a1a91e..f146001 100644 --- a/deflate.c +++ b/deflate.c @@ -586,7 +586,8 @@ int ZEXPORT deflateParams(strm, level, strategy) } func = configuration_table[s->level].func; - if ((strategy != s->strategy || func != configuration_table[level].func)) { + if ((strategy != s->strategy || func != configuration_table[level].func) && + s->high_water) { /* Flush the last buffer: */ int err = deflate(strm, Z_BLOCK); if (err == Z_STREAM_ERROR) diff --git a/zlib.h b/zlib.h index feabc54..a4b3baf 100644 --- a/zlib.h +++ b/zlib.h @@ -712,10 +712,11 @@ ZEXTERN int ZEXPORT deflateParams OF((z_streamp strm, used to switch between compression and straight copy of the input data, or to switch to a different kind of input data requiring a different strategy. If the compression approach (which is a function of the level) or the - strategy is changed, then the input available so far is compressed with the - old level and strategy using deflate(strm, Z_BLOCK). There are three - approaches for the compression levels 0, 1..3, and 4..9 respectively. The - new level and strategy will take effect at the next call of deflate(). + strategy is changed, and if any input has been consumed in a previous + deflate() call, then the input available so far is compressed with the old + level and strategy using deflate(strm, Z_BLOCK). There are three approaches + for the compression levels 0, 1..3, and 4..9 respectively. The new level + and strategy will take effect at the next call of deflate(). If a deflate(strm, Z_BLOCK) is performed by deflateParams(), and it does not have enough output space to complete, then the parameter change will not