summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--archival/libarchive/bz/compress.c44
1 files changed, 13 insertions, 31 deletions
diff --git a/archival/libarchive/bz/compress.c b/archival/libarchive/bz/compress.c
index 0d083486b..6260fd94c 100644
--- a/archival/libarchive/bz/compress.c
+++ b/archival/libarchive/bz/compress.c
@@ -162,7 +162,7 @@ static NOINLINE
void generateMTFValues(EState* s)
{
uint8_t yy[256];
- int32_t i, j;
+ int i;
int zPend;
int32_t wr;
int32_t EOB;
@@ -195,16 +195,18 @@ void generateMTFValues(EState* s)
makeMaps_e(s);
EOB = s->nInUse+1;
+ wr = 0;
+ zPend = 0;
for (i = 0; i <= EOB; i++)
s->mtfFreq[i] = 0;
- wr = 0;
- zPend = 0;
for (i = 0; i < s->nInUse; i++)
yy[i] = (uint8_t) i;
for (i = 0; i < s->nblock; i++) {
- uint8_t ll_i;
+ uint8_t ll_i = ll_i; /* gcc 4.3.1 thinks it may be used w/o init */
+ int32_t j;
+
AssertD(wr <= i, "generateMTFValues(1)");
j = ptr[i] - 1;
if (j < 0)
@@ -216,6 +218,7 @@ void generateMTFValues(EState* s)
zPend++;
} else {
if (zPend > 0) {
+ process_zPend:
zPend--;
while (1) {
#if 0
@@ -238,6 +241,8 @@ void generateMTFValues(EState* s)
zPend = (unsigned)zPend / 2;
/* bbox: unsigned div is easier */
}
+ if (i < 0) /* came via "goto process_zPend"? exit */
+ goto end;
zPend = 0;
}
{
@@ -264,33 +269,10 @@ void generateMTFValues(EState* s)
}
}
- if (zPend > 0) {
- zPend--;
- while (1) {
-#if 0
- if (zPend & 1) {
- mtfv[wr] = BZ_RUNB;
- wr++;
- s->mtfFreq[BZ_RUNB]++;
- } else {
- mtfv[wr] = BZ_RUNA;
- wr++;
- s->mtfFreq[BZ_RUNA]++;
- }
-#else /* same as above, since BZ_RUNA is 0 and BZ_RUNB is 1 */
- unsigned run = zPend & 1;
- mtfv[wr] = run;
- wr++;
- s->mtfFreq[run]++;
-#endif
- zPend -= 2;
- if (zPend < 0)
- break;
- zPend = (unsigned)zPend / 2;
- /* bbox: unsigned div is easier */
- }
- }
-
+ i = -1;
+ if (zPend > 0)
+ goto process_zPend; /* "process it and come back here" */
+ end:
mtfv[wr] = EOB;
wr++;
s->mtfFreq[EOB]++;