decompress_bunzip2: code shrink ~5 bytes

Signed-off-by: Denys Vlasenko <dvlasenk@redhat.com>
This commit is contained in:
Denys Vlasenko 2010-10-30 00:55:02 +02:00
parent 0c576975c8
commit f16727ebbb

View File

@ -153,6 +153,7 @@ static int get_next_block(bunzip_data *bd)
struct group_data *hufGroup; struct group_data *hufGroup;
int dbufCount, dbufSize, groupCount, *base, *limit, selector, int dbufCount, dbufSize, groupCount, *base, *limit, selector,
i, j, t, runPos, symCount, symTotal, nSelectors, byteCount[256]; i, j, t, runPos, symCount, symTotal, nSelectors, byteCount[256];
int runCnt = runCnt; /* for compiler */
uint8_t uc, symToByte[256], mtfSymbol[256], *selectors; uint8_t uc, symToByte[256], mtfSymbol[256], *selectors;
uint32_t *dbuf; uint32_t *dbuf;
unsigned origPtr; unsigned origPtr;
@ -242,19 +243,19 @@ static int get_next_block(bunzip_data *bd)
uint8_t length[MAX_SYMBOLS]; uint8_t length[MAX_SYMBOLS];
/* 8 bits is ALMOST enough for temp[], see below */ /* 8 bits is ALMOST enough for temp[], see below */
unsigned temp[MAX_HUFCODE_BITS+1]; unsigned temp[MAX_HUFCODE_BITS+1];
int minLen, maxLen, pp; int minLen, maxLen, pp, len_m1;
/* Read Huffman code lengths for each symbol. They're stored in /* Read Huffman code lengths for each symbol. They're stored in
a way similar to mtf; record a starting value for the first symbol, a way similar to mtf; record a starting value for the first symbol,
and an offset from the previous value for everys symbol after that. and an offset from the previous value for every symbol after that.
(Subtracting 1 before the loop and then adding it back at the end is (Subtracting 1 before the loop and then adding it back at the end is
an optimization that makes the test inside the loop simpler: symbol an optimization that makes the test inside the loop simpler: symbol
length 0 becomes negative, so an unsigned inequality catches it.) */ length 0 becomes negative, so an unsigned inequality catches it.) */
t = get_bits(bd, 5) - 1; len_m1 = get_bits(bd, 5) - 1;
for (i = 0; i < symCount; i++) { for (i = 0; i < symCount; i++) {
for (;;) { for (;;) {
int two_bits; int two_bits;
if ((unsigned)t > (MAX_HUFCODE_BITS-1)) if ((unsigned)len_m1 > (MAX_HUFCODE_BITS-1))
return RETVAL_DATA_ERROR; return RETVAL_DATA_ERROR;
/* If first bit is 0, stop. Else second bit indicates whether /* If first bit is 0, stop. Else second bit indicates whether
@ -267,11 +268,11 @@ static int get_next_block(bunzip_data *bd)
} }
/* Add one if second bit 1, else subtract 1. Avoids if/else */ /* Add one if second bit 1, else subtract 1. Avoids if/else */
t += (((two_bits+1) & 2) - 1); len_m1 += (((two_bits+1) & 2) - 1);
} }
/* Correct for the initial -1, to get the final symbol length */ /* Correct for the initial -1, to get the final symbol length */
length[i] = t + 1; length[i] = len_m1 + 1;
} }
/* Find largest and smallest lengths in this group */ /* Find largest and smallest lengths in this group */
@ -337,8 +338,8 @@ static int get_next_block(bunzip_data *bd)
t += temp_i; t += temp_i;
base[++i] = pp - t; base[++i] = pp - t;
} }
limit[maxLen+1] = INT_MAX; /* Sentinel value for reading next sym. */
limit[maxLen] = pp + temp[maxLen] - 1; limit[maxLen] = pp + temp[maxLen] - 1;
limit[maxLen+1] = INT_MAX; /* Sentinel value for reading next sym. */
base[minLen] = 0; base[minLen] = 0;
} }
@ -418,7 +419,7 @@ static int get_next_block(bunzip_data *bd)
/* If this is the start of a new run, zero out counter */ /* If this is the start of a new run, zero out counter */
if (runPos == 0) { if (runPos == 0) {
runPos = 1; runPos = 1;
t = 0; runCnt = 0;
} }
/* Neat trick that saves 1 symbol: instead of or-ing 0 or 1 at /* Neat trick that saves 1 symbol: instead of or-ing 0 or 1 at
@ -428,7 +429,7 @@ static int get_next_block(bunzip_data *bd)
the basic or 0/1 method (except all bits 0, which would use no the basic or 0/1 method (except all bits 0, which would use no
symbols, but a run of length 0 doesn't mean anything in this symbols, but a run of length 0 doesn't mean anything in this
context). Thus space is saved. */ context). Thus space is saved. */
t += (runPos << nextSym); /* +runPos if RUNA; +2*runPos if RUNB */ runCnt += (runPos << nextSym); /* +runPos if RUNA; +2*runPos if RUNB */
if (runPos < dbufSize) runPos <<= 1; if (runPos < dbufSize) runPos <<= 1;
goto end_of_huffman_loop; goto end_of_huffman_loop;
} }
@ -439,10 +440,10 @@ static int get_next_block(bunzip_data *bd)
literal used is the one at the head of the mtfSymbol array.) */ literal used is the one at the head of the mtfSymbol array.) */
if (runPos != 0) { if (runPos != 0) {
uint8_t tmp_byte; uint8_t tmp_byte;
if (dbufCount + t >= dbufSize) return RETVAL_DATA_ERROR; if (dbufCount + runCnt >= dbufSize) return RETVAL_DATA_ERROR;
tmp_byte = symToByte[mtfSymbol[0]]; tmp_byte = symToByte[mtfSymbol[0]];
byteCount[tmp_byte] += t; byteCount[tmp_byte] += runCnt;
while (--t >= 0) dbuf[dbufCount++] = tmp_byte; while (--runCnt >= 0) dbuf[dbufCount++] = (uint32_t)tmp_byte;
runPos = 0; runPos = 0;
} }