decompress_bunzip2: code shrink ~5 bytes
Signed-off-by: Denys Vlasenko <dvlasenk@redhat.com>
This commit is contained in:
parent
0c576975c8
commit
f16727ebbb
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user