bzip2: code shrink
authorDenys Vlasenko <vda.linux@googlemail.com>
Sat, 3 Feb 2018 00:30:12 +0000 (01:30 +0100)
committerDenys Vlasenko <vda.linux@googlemail.com>
Sat, 3 Feb 2018 00:30:12 +0000 (01:30 +0100)
function                                             old     new   delta
BZ2_compressBlock                                    225     230      +5
handle_compress                                      356     355      -1
bsW16                                                 59      56      -3
bsW                                                   64      61      -3
bsFinishWrite                                         37      32      -5
prepare_new_block                                     48      34     -14
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 1/5 up/down: 5/-26)             Total: -21 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
archival/libarchive/bz/bzlib.c
archival/libarchive/bz/bzlib_private.h
archival/libarchive/bz/compress.c

index 5f7db747aecf2a2f852cb63d2ec7f6db116659a6..3572474f4faf7b77ce13190a761d3b2f286dd972 100644 (file)
@@ -55,8 +55,9 @@ void prepare_new_block(EState* s)
 {
        int i;
        s->nblock = 0;
-       s->numZ = 0;
-       s->state_out_pos = 0;
+       //indexes inot s->zbits[], initialzation moved to init of s->zbits
+       //s->posZ = s->zbits; // was: s->numZ = 0;
+       //s->state_out_pos = s->zbits;
        BZ_INITIALISE_CRC(s->blockCRC);
        /* inlined memset would be nice to have here */
        for (i = 0; i < 256; i++)
@@ -237,11 +238,10 @@ void /*Bool*/ copy_output_until_stop(EState* s)
                if (s->strm->avail_out == 0) break;
 
                /*-- block done? --*/
-               if (s->state_out_pos >= s->numZ) break;
+               if (s->state_out_pos >= s->posZ) break;
 
                /*progress_out = True;*/
-               *(s->strm->next_out) = s->zbits[s->state_out_pos];
-               s->state_out_pos++;
+               *(s->strm->next_out) = *s->state_out_pos++;
                s->strm->avail_out--;
                s->strm->next_out++;
                s->strm->total_out++;
@@ -261,7 +261,7 @@ void /*Bool*/ handle_compress(bz_stream *strm)
        while (1) {
                if (s->state == BZ_S_OUTPUT) {
                        /*progress_out |=*/ copy_output_until_stop(s);
-                       if (s->state_out_pos < s->numZ) break;
+                       if (s->state_out_pos < s->posZ) break;
                        if (s->mode == BZ_M_FINISHING
                        //# && s->avail_in_expect == 0
                         && s->strm->avail_in == 0
@@ -336,7 +336,7 @@ int BZ2_bzCompress(bz_stream *strm, int action)
                        /*if (s->avail_in_expect != s->strm->avail_in)
                                return BZ_SEQUENCE_ERROR;*/
                        /*progress =*/ handle_compress(strm);
-                       if (s->avail_in_expect > 0 || !isempty_RL(s) || s->state_out_pos < s->numZ)
+                       if (s->avail_in_expect > 0 || !isempty_RL(s) || s->state_out_pos < s->posZ)
                                return BZ_FLUSH_OK;
                        s->mode = BZ_M_RUNNING;
                        return BZ_RUN_OK;
@@ -349,9 +349,9 @@ int BZ2_bzCompress(bz_stream *strm, int action)
                                return BZ_SEQUENCE_ERROR;*/
                        /*progress =*/ handle_compress(strm);
                        /*if (!progress) return BZ_SEQUENCE_ERROR;*/
-                       //#if (s->avail_in_expect > 0 || !isempty_RL(s) || s->state_out_pos < s->numZ)
+                       //#if (s->avail_in_expect > 0 || !isempty_RL(s) || s->state_out_pos < s->posZ)
                        //#     return BZ_FINISH_OK;
-                       if (s->strm->avail_in > 0 || !isempty_RL(s) || s->state_out_pos < s->numZ)
+                       if (s->strm->avail_in > 0 || !isempty_RL(s) || s->state_out_pos < s->posZ)
                                return BZ_FINISH_OK;
                        /*s->mode = BZ_M_IDLE;*/
                        return BZ_STREAM_END;
index 43e674bec8ec9eebd501bad490c43f4b51e6d614..8e44a8e6407d5267150c21d1f9ebe65a09cd2ebd 100644 (file)
@@ -150,8 +150,9 @@ typedef struct EState {
        /* input and output limits and current posns */
        int32_t  nblock;
        int32_t  nblockMAX;
-       int32_t  numZ;
-       int32_t  state_out_pos;
+       //int32_t  numZ; // index into s->zbits[], replaced by pointer:
+       uint8_t *posZ;
+       uint8_t *state_out_pos;
 
        /* the buffer for bit stream creation */
        uint32_t bsBuff;
index c640173e584ab7cb3532dcdcde13540c731bf6f5..534cf665a8d641ee706752f922188c337d7adc71 100644 (file)
@@ -50,8 +50,7 @@ static NOINLINE
 void bsFinishWrite(EState* s)
 {
        while (s->bsLive > 0) {
-               s->zbits[s->numZ] = (uint8_t)(s->bsBuff >> 24);
-               s->numZ++;
+               *s->posZ++ = (uint8_t)(s->bsBuff >> 24);
                s->bsBuff <<= 8;
                s->bsLive -= 8;
        }
@@ -67,8 +66,7 @@ ALWAYS_INLINE
 void bsW(EState* s, int32_t n, uint32_t v)
 {
        while (s->bsLive >= 8) {
-               s->zbits[s->numZ] = (uint8_t)(s->bsBuff >> 24);
-               s->numZ++;
+               *s->posZ++ = (uint8_t)(s->bsBuff >> 24);
                s->bsBuff <<= 8;
                s->bsLive -= 8;
        }
@@ -83,8 +81,7 @@ ALWAYS_INLINE
 void bsW16(EState* s, uint32_t v)
 {
        while (s->bsLive >= 8) {
-               s->zbits[s->numZ] = (uint8_t)(s->bsBuff >> 24);
-               s->numZ++;
+               *s->posZ++ = (uint8_t)(s->bsBuff >> 24);
                s->bsBuff <<= 8;
                s->bsLive -= 8;
        }
@@ -624,12 +621,14 @@ void BZ2_compressBlock(EState* s, int is_last_block)
                s->combinedCRC = (s->combinedCRC << 1) | (s->combinedCRC >> 31);
                s->combinedCRC ^= s->blockCRC;
                if (s->blockNo > 1)
-                       s->numZ = 0;
+                       s->posZ = s->zbits; // was: s->numZ = 0;
 
                BZ2_blockSort(s);
        }
 
        s->zbits = &((uint8_t*)s->arr2)[s->nblock];
+       s->posZ = s->zbits;
+       s->state_out_pos = s->zbits;
 
        /*-- If this is the first block, create the stream header. --*/
        if (s->blockNo == 1) {