Applied, thanks
On Mon, Sep 2, 2019 at 11:58 PM Daniel Edgecumbe <[email protected]> wrote: > > Let's try once more, patches inline (new email client, gah!) > > 0001-gzip-default-level-with-ENABLE_FEATURE_GZIP_LEVELS-s.patch > > From 9d06f01e2805a5d6f1d775ceb651ae18ae2e1808 Mon Sep 17 00:00:00 2001 > From: Daniel Edgecumbe <[email protected]> > Date: Mon, 2 Sep 2019 22:03:14 +0100 > Subject: [PATCH 1/3] gzip: default level with ENABLE_FEATURE_GZIP_LEVELS > should be 6 > > Fixes an off-by-one that actually resulted in level 7 being used > --- > archival/gzip.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/archival/gzip.c b/archival/gzip.c > index 17341de45..37db347b8 100644 > --- a/archival/gzip.c > +++ b/archival/gzip.c > @@ -2222,7 +2222,7 @@ int gzip_main(int argc UNUSED_PARAM, char **argv) > #if ENABLE_FEATURE_GZIP_LEVELS > opt >>= (BBUNPK_OPTSTRLEN IF_FEATURE_GZIP_DECOMPRESS(+ 2) + 1); /* > drop cfkvq[dt]n bits */ > if (opt == 0) > - opt = 1 << 6; /* default: 6 */ > + opt = 1 << 5; /* default: 6 */ > opt = ffs(opt >> 4); /* Maps -1..-4 to [0], -5 to [1] ... -9 to [5] */ > max_chain_length = 1 << gzip_level_config[opt].chain_shift; > good_match = gzip_level_config[opt].good; > -- > 2.23.0 > > 0002-gzip-set-compression-flags-correctly-as-per-standard.patch > > From 4280c9633b359dcbf2ddadcf33790b8690f81c82 Mon Sep 17 00:00:00 2001 > From: Daniel Edgecumbe <[email protected]> > Date: Mon, 2 Sep 2019 22:05:26 +0100 > Subject: [PATCH 2/3] gzip: set compression flags correctly as per standard > > With this change and CONFIG_GZIP_FAST=2, CONFIG_FEATURE_GZIP_LEVELS=y, > > GNU gzip and BusyBox gzip now produce identical output at each compression > level (excluding 1..3, as BusyBox does not implement these levels). > --- > archival/gzip.c | 22 ++++++++++++++++------ > 1 file changed, 16 insertions(+), 6 deletions(-) > > diff --git a/archival/gzip.c b/archival/gzip.c > index 37db347b8..f13748aa1 100644 > --- a/archival/gzip.c > +++ b/archival/gzip.c > @@ -259,6 +259,7 @@ enum { > > #if !ENABLE_FEATURE_GZIP_LEVELS > > + comp_level = 9, > max_chain_length = 4096, > /* To speed up deflation, hash chains are never searched beyond this length. > * A higher limit improves compression ratio but degrades the speed. > @@ -334,10 +335,12 @@ struct globals { > #define head (G1.prev + WSIZE) /* hash head (see deflate.c) */ > > #if ENABLE_FEATURE_GZIP_LEVELS > + unsigned comp_level; > unsigned max_chain_length; > unsigned max_lazy_match; > unsigned good_match; > unsigned nice_match; > +#define comp_level (G1.comp_level) > #define max_chain_length (G1.max_chain_length) > #define max_lazy_match (G1.max_lazy_match) > #define good_match (G1.good_match) > @@ -1919,7 +1922,7 @@ static void bi_init(void) > /* > =========================================================================== > * Initialize the "longest match" routines for a new file > */ > -static void lm_init(unsigned *flags16p) > +static void lm_init(void) > { > unsigned j; > > @@ -1927,8 +1930,6 @@ static void lm_init(unsigned *flags16p) > memset(head, 0, HASH_SIZE * sizeof(*head)); > /* prev will be initialized on the fly */ > > - /* speed options for the general purpose bit flag */ > - *flags16p |= 2; /* FAST 4, SLOW 2 */ > /* ??? reduce max_chain_length for binary files */ > > //G1.strstart = 0; // globals are zeroed in pack_gzip() > @@ -2076,10 +2077,16 @@ static void zip(void) > > bi_init(); > ct_init(); > - deflate_flags = 0; /* pkzip -es, -en or -ex equivalent */ > - lm_init(&deflate_flags); > + lm_init(); > > - put_16bit(deflate_flags | 0x300); /* extra flags. OS id = 3 (Unix) */ > + deflate_flags = 0x300; /* extra flags. OS id = 3 (Unix) */ > +#if ENABLE_FEATURE_GZIP_LEVELS > + /* Note that comp_levels < 4 do not exist in this version of gzip */ > + if (comp_level == 9) { > + deflate_flags |= 0x02; /* SLOW flag */ > + } > +#endif > + put_16bit(deflate_flags); > > /* The above 32-bit misaligns outbuf (10 bytes are stored), flush it > */ > flush_outbuf_if_32bit_optimized(); > @@ -2224,6 +2231,9 @@ int gzip_main(int argc UNUSED_PARAM, char **argv) > if (opt == 0) > opt = 1 << 5; /* default: 6 */ > opt = ffs(opt >> 4); /* Maps -1..-4 to [0], -5 to [1] ... -9 to [5] */ > + > + comp_level = opt + 4; > + > max_chain_length = 1 << gzip_level_config[opt].chain_shift; > good_match = gzip_level_config[opt].good; > max_lazy_match = gzip_level_config[opt].lazy2 * 2; > -- > 2.23.0 > > 0003-gzip-set-default-compression-level-to-6-when-CONFIG_.patch > > From 12d30559486502feec4e2821b3ab45ae6139e7aa Mon Sep 17 00:00:00 2001 > From: Daniel Edgecumbe <[email protected]> > Date: Mon, 2 Sep 2019 22:09:15 +0100 > Subject: [PATCH 3/3] gzip: set default compression level to 6 when > CONFIG_FEATURE_GZIP_LEVELS=n > > With this change, GNU gzip -n and BusyBox gzip now produce identical output > assuming that CONFIG_GZIP_FAST=2. > --- > archival/gzip.c | 12 ++++++------ > 1 file changed, 6 insertions(+), 6 deletions(-) > > diff --git a/archival/gzip.c b/archival/gzip.c > index f13748aa1..779df5c19 100644 > --- a/archival/gzip.c > +++ b/archival/gzip.c > @@ -52,7 +52,7 @@ aa: 85.1% -- replaced with aa.gz > //config: help > //config: Enable support for compression levels 4-9. The default level > //config: is 6. If levels 1-3 are specified, 4 is used. > -//config: If this option is not selected, -N options are ignored and -9 > +//config: If this option is not selected, -N options are ignored and -6 > //config: is used. > //config: > //config:config FEATURE_GZIP_DECOMPRESS > @@ -259,13 +259,13 @@ enum { > > #if !ENABLE_FEATURE_GZIP_LEVELS > > - comp_level = 9, > - max_chain_length = 4096, > + comp_level = 6, > + max_chain_length = 128, > /* To speed up deflation, hash chains are never searched beyond this length. > * A higher limit improves compression ratio but degrades the speed. > */ > > - max_lazy_match = 258, > + max_lazy_match = 16, > /* Attempt to find a better match only when the current match is strictly > * smaller than this value. This mechanism is used only for compression > * levels >= 4. > @@ -277,7 +277,7 @@ enum { > * max_insert_length is used only for compression levels <= 3. > */ > > - good_match = 32, > + good_match = 8, > /* Use a faster search when the previous match is longer than this */ > > /* Values for max_lazy_match, good_match and max_chain_length, depending on > @@ -286,7 +286,7 @@ enum { > * found for specific files. > */ > > - nice_match = 258, /* Stop searching when current match exceeds > this */ > + nice_match = 128, /* Stop searching when current match exceeds > this */ > /* Note: the deflate() code requires max_lazy >= MIN_MATCH and max_chain >= 4 > * For deflate_fast() (levels <= 3) good is ignored and lazy has a different > * meaning. > -- > 2.23.0 > > On 02/09/2019 23.43, Daniel Edgecumbe wrote: > > A discussion with eschwartz on the Arch Linux freenode IRC channel led to > > the discovery of some minor implementation details lacking in the BusyBox > > gzip applet which can cause output to differ both across GNU gzip and > > BusyBox, and different versions of BusyBox. > > > > Please find attached three seperate patches for the solution of these > > issues. > > > > I've also pushed the branch at > > https://git.esotericnonsense.com/busybox.git/ > > > > This is a re-submission as my original e-mail was bounced due to not being > > an ML member. > > > > > > _______________________________________________ > > busybox mailing list > > [email protected] > > http://lists.busybox.net/mailman/listinfo/busybox > > > > -- > Daniel Edgecumbe | esotericnonsense > Kalix NO, Sverige | +358 46 584 2810 > [email protected] | https://esotericnonsense.com > _______________________________________________ > busybox mailing list > [email protected] > http://lists.busybox.net/mailman/listinfo/busybox _______________________________________________ busybox mailing list [email protected] http://lists.busybox.net/mailman/listinfo/busybox
