[git commit] bzip2: code shrink, stop using global data variable

Denys Vlasenko vda.linux at googlemail.com
Thu Feb 1 00:00:58 UTC 2018


commit: https://git.busybox.net/busybox/commit/?id=1b8ac93a2010e85eaca959f520e00961a2bb5c65
branch: https://git.busybox.net/busybox/commit/?id=refs/heads/master

function                                             old     new   delta
compressStream                                       523     538     +15
level                                                  1       -      -1
bzip2_main                                           110      73     -37
------------------------------------------------------------------------------
(add/remove: 0/1 grow/shrink: 1/1 up/down: 15/-38)            Total: -23 bytes

Signed-off-by: Denys Vlasenko <vda.linux at googlemail.com>
---
 archival/bzip2.c | 32 +++++++++++++++++---------------
 1 file changed, 17 insertions(+), 15 deletions(-)

diff --git a/archival/bzip2.c b/archival/bzip2.c
index d6fd9296d..c3969a9e8 100644
--- a/archival/bzip2.c
+++ b/archival/bzip2.c
@@ -83,15 +83,13 @@
 /* No point in being shy and having very small buffer here.
  * bzip2 internal buffers are much bigger anyway, hundreds of kbytes.
  * If iobuf is several pages long, malloc() may use mmap,
- * making iobuf is page aligned and thus (maybe) have one memcpy less
+ * making iobuf page aligned and thus (maybe) have one memcpy less
  * if kernel is clever enough.
  */
 enum {
 	IOBUF_SIZE = 8 * 1024
 };
 
-static uint8_t level;
-
 /* NB: compressStream() has to return -1 on errors, not die.
  * bbunpack() will correctly clean up in this case
  * (delete incomplete .bz2 file)
@@ -143,6 +141,7 @@ static
 IF_DESKTOP(long long) int FAST_FUNC compressStream(transformer_state_t *xstate UNUSED_PARAM)
 {
 	IF_DESKTOP(long long) int total;
+	unsigned opt, level;
 	ssize_t count;
 	bz_stream bzs; /* it's small */
 #define strm (&bzs)
@@ -151,6 +150,16 @@ IF_DESKTOP(long long) int FAST_FUNC compressStream(transformer_state_t *xstate U
 #define wbuf (iobuf + IOBUF_SIZE)
 
 	iobuf = xmalloc(2 * IOBUF_SIZE);
+
+	opt = option_mask32 >> (sizeof("cfkvq" IF_FEATURE_BZIP2_DECOMPRESS("dt") "zs") - 1);
+	opt |= 0x100; /* if nothing else, assume -9 */
+	level = 0;
+	for (;;) {
+		level++;
+		if (opt & 1) break;
+		opt >>= 1;
+	}
+
 	BZ2_bzCompressInit(strm, level);
 
 	while (1) {
@@ -197,25 +206,18 @@ int bzip2_main(int argc UNUSED_PARAM, char **argv)
 
 	opt = getopt32(argv, "^"
 		/* Must match bbunzip's constants OPT_STDOUT, OPT_FORCE! */
-		"cfkv" IF_FEATURE_BZIP2_DECOMPRESS("dt") "123456789qzs"
+		"cfkvq" IF_FEATURE_BZIP2_DECOMPRESS("dt") "zs123456789"
 		"\0" "s2" /* -s means -2 (compatibility) */
 	);
 #if ENABLE_FEATURE_BZIP2_DECOMPRESS /* bunzip2_main may not be visible... */
-	if (opt & 0x30) // -d and/or -t
+	if (opt & (3 << 5)) /* -d and/or -t */
 		return bunzip2_main(argc, argv);
-	opt >>= 6;
 #else
-	opt >>= 4;
+	/* clear "decompress" and "test" bits (or bbunpack() can get confused) */
+	/* in !BZIP2_DECOMPRESS config, these bits are -zs and are unused */
+	option_mask32 = opt & ~(3 << 5);
 #endif
-	opt = (uint8_t)opt; /* isolate bits for -1..-8 */
-	opt |= 0x100; /* if nothing else, assume -9 */
-	level = 1;
-	while (!(opt & 1)) {
-		level++;
-		opt >>= 1;
-	}
 
 	argv += optind;
-	option_mask32 &= 0xf; /* ignore all except -cfkv */
 	return bbunpack(argv, compressStream, append_ext, "bz2");
 }


More information about the busybox-cvs mailing list