|
|
@@ -89,13 +89,12 @@ public class CBZip2InputStream extends InputStream implements BZip2Constants { |
|
|
private void makeMaps() { |
|
|
private void makeMaps() { |
|
|
int i; |
|
|
int i; |
|
|
nInUse = 0; |
|
|
nInUse = 0; |
|
|
for (i = 0; i < 256; i++) { |
|
|
|
|
|
|
|
|
for (i = 0; i < 256; i++) |
|
|
if (inUse[i]) { |
|
|
if (inUse[i]) { |
|
|
seqToUnseq[nInUse] = (char)i; |
|
|
seqToUnseq[nInUse] = (char)i; |
|
|
unseqToSeq[i] = (char)nInUse; |
|
|
unseqToSeq[i] = (char)nInUse; |
|
|
nInUse++; |
|
|
nInUse++; |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
/* |
|
|
/* |
|
|
@@ -250,11 +249,10 @@ public class CBZip2InputStream extends InputStream implements BZip2Constants { |
|
|
|
|
|
|
|
|
storedBlockCRC = bsGetInt32(); |
|
|
storedBlockCRC = bsGetInt32(); |
|
|
|
|
|
|
|
|
if (bsR(1) == 1) { |
|
|
|
|
|
|
|
|
if (bsR(1) == 1) |
|
|
blockRandomised = true; |
|
|
blockRandomised = true; |
|
|
} else { |
|
|
|
|
|
|
|
|
else |
|
|
blockRandomised = false; |
|
|
blockRandomised = false; |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// currBlockNo++; |
|
|
// currBlockNo++; |
|
|
getAndMoveToFrontDecode(); |
|
|
getAndMoveToFrontDecode(); |
|
|
@@ -266,9 +264,8 @@ public class CBZip2InputStream extends InputStream implements BZip2Constants { |
|
|
private void endBlock() { |
|
|
private void endBlock() { |
|
|
computedBlockCRC = mCrc.getFinalCRC(); |
|
|
computedBlockCRC = mCrc.getFinalCRC(); |
|
|
/* A bad CRC is considered a fatal error. */ |
|
|
/* A bad CRC is considered a fatal error. */ |
|
|
if (storedBlockCRC != computedBlockCRC) { |
|
|
|
|
|
|
|
|
if (storedBlockCRC != computedBlockCRC) |
|
|
crcError(); |
|
|
crcError(); |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
computedCombinedCRC = (computedCombinedCRC << 1) |
|
|
computedCombinedCRC = (computedCombinedCRC << 1) |
|
|
| (computedCombinedCRC >>> 31); |
|
|
| (computedCombinedCRC >>> 31); |
|
|
@@ -277,9 +274,8 @@ public class CBZip2InputStream extends InputStream implements BZip2Constants { |
|
|
|
|
|
|
|
|
private void complete() { |
|
|
private void complete() { |
|
|
storedCombinedCRC = bsGetInt32(); |
|
|
storedCombinedCRC = bsGetInt32(); |
|
|
if (storedCombinedCRC != computedCombinedCRC) { |
|
|
|
|
|
|
|
|
if (storedCombinedCRC != computedCombinedCRC) |
|
|
crcError(); |
|
|
crcError(); |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
bsFinishedWithStream(); |
|
|
bsFinishedWithStream(); |
|
|
streamEnd = true; |
|
|
streamEnd = true; |
|
|
@@ -361,28 +357,23 @@ public class CBZip2InputStream extends InputStream implements BZip2Constants { |
|
|
int pp, i, j, vec; |
|
|
int pp, i, j, vec; |
|
|
|
|
|
|
|
|
pp = 0; |
|
|
pp = 0; |
|
|
for(i = minLen; i <= maxLen; i++) { |
|
|
|
|
|
for(j = 0; j < alphaSize; j++) { |
|
|
|
|
|
|
|
|
for(i = minLen; i <= maxLen; i++) |
|
|
|
|
|
for(j = 0; j < alphaSize; j++) |
|
|
if (length[j] == i) { |
|
|
if (length[j] == i) { |
|
|
perm[pp] = j; |
|
|
perm[pp] = j; |
|
|
pp++; |
|
|
pp++; |
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
for(i = 0; i < MAX_CODE_LEN; i++) { |
|
|
|
|
|
|
|
|
for(i = 0; i < MAX_CODE_LEN; i++) |
|
|
base[i] = 0; |
|
|
base[i] = 0; |
|
|
} |
|
|
|
|
|
for(i = 0; i < alphaSize; i++) { |
|
|
|
|
|
|
|
|
for(i = 0; i < alphaSize; i++) |
|
|
base[length[i]+1]++; |
|
|
base[length[i]+1]++; |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
for(i = 1; i < MAX_CODE_LEN; i++) |
|
|
for(i = 1; i < MAX_CODE_LEN; i++) |
|
|
base[i] += base[i-1]; |
|
|
base[i] += base[i-1]; |
|
|
|
|
|
|
|
|
for (i = 0; i < MAX_CODE_LEN; i++) { |
|
|
|
|
|
|
|
|
for (i = 0; i < MAX_CODE_LEN; i++) |
|
|
limit[i] = 0; |
|
|
limit[i] = 0; |
|
|
} |
|
|
|
|
|
vec = 0; |
|
|
vec = 0; |
|
|
|
|
|
|
|
|
for (i = minLen; i <= maxLen; i++) { |
|
|
for (i = minLen; i <= maxLen; i++) { |
|
|
@@ -390,9 +381,8 @@ public class CBZip2InputStream extends InputStream implements BZip2Constants { |
|
|
limit[i] = vec-1; |
|
|
limit[i] = vec-1; |
|
|
vec <<= 1; |
|
|
vec <<= 1; |
|
|
} |
|
|
} |
|
|
for (i = minLen + 1; i <= maxLen; i++) { |
|
|
|
|
|
|
|
|
for (i = minLen + 1; i <= maxLen; i++) |
|
|
base[i] = ((limit[i-1] + 1) << 1) - base[i]; |
|
|
base[i] = ((limit[i-1] + 1) << 1) - base[i]; |
|
|
} |
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
private void recvDecodingTables() { |
|
|
private void recvDecodingTables() { |
|
|
@@ -402,27 +392,20 @@ public class CBZip2InputStream extends InputStream implements BZip2Constants { |
|
|
boolean inUse16[] = new boolean[16]; |
|
|
boolean inUse16[] = new boolean[16]; |
|
|
|
|
|
|
|
|
/* Receive the mapping table */ |
|
|
/* Receive the mapping table */ |
|
|
for (i = 0; i < 16; i++) { |
|
|
|
|
|
if (bsR(1) == 1) { |
|
|
|
|
|
|
|
|
for (i = 0; i < 16; i++) |
|
|
|
|
|
if (bsR(1) == 1) |
|
|
inUse16[i] = true; |
|
|
inUse16[i] = true; |
|
|
} else { |
|
|
|
|
|
|
|
|
else |
|
|
inUse16[i] = false; |
|
|
inUse16[i] = false; |
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
for (i = 0; i < 256; i++) { |
|
|
|
|
|
|
|
|
for (i = 0; i < 256; i++) |
|
|
inUse[i] = false; |
|
|
inUse[i] = false; |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
for (i = 0; i < 16; i++) { |
|
|
|
|
|
if (inUse16[i]) { |
|
|
|
|
|
for (j = 0; j < 16; j++) { |
|
|
|
|
|
if (bsR(1) == 1) { |
|
|
|
|
|
|
|
|
for (i = 0; i < 16; i++) |
|
|
|
|
|
if (inUse16[i]) |
|
|
|
|
|
for (j = 0; j < 16; j++) |
|
|
|
|
|
if (bsR(1) == 1) |
|
|
inUse[i * 16 + j] = true; |
|
|
inUse[i * 16 + j] = true; |
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
makeMaps(); |
|
|
makeMaps(); |
|
|
alphaSize = nInUse+2; |
|
|
alphaSize = nInUse+2; |
|
|
@@ -432,9 +415,8 @@ public class CBZip2InputStream extends InputStream implements BZip2Constants { |
|
|
nSelectors = bsR(15); |
|
|
nSelectors = bsR(15); |
|
|
for (i = 0; i < nSelectors; i++) { |
|
|
for (i = 0; i < nSelectors; i++) { |
|
|
j = 0; |
|
|
j = 0; |
|
|
while (bsR(1) == 1) { |
|
|
|
|
|
|
|
|
while (bsR(1) == 1) |
|
|
j++; |
|
|
j++; |
|
|
} |
|
|
|
|
|
selectorMtf[i] = (char)j; |
|
|
selectorMtf[i] = (char)j; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
@@ -442,9 +424,8 @@ public class CBZip2InputStream extends InputStream implements BZip2Constants { |
|
|
{ |
|
|
{ |
|
|
char pos[] = new char[N_GROUPS]; |
|
|
char pos[] = new char[N_GROUPS]; |
|
|
char tmp, v; |
|
|
char tmp, v; |
|
|
for (v = 0; v < nGroups; v++) { |
|
|
|
|
|
|
|
|
for (v = 0; v < nGroups; v++) |
|
|
pos[v] = v; |
|
|
pos[v] = v; |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
for (i = 0; i < nSelectors; i++) { |
|
|
for (i = 0; i < nSelectors; i++) { |
|
|
v = selectorMtf[i]; |
|
|
v = selectorMtf[i]; |
|
|
@@ -463,11 +444,10 @@ public class CBZip2InputStream extends InputStream implements BZip2Constants { |
|
|
int curr = bsR ( 5 ); |
|
|
int curr = bsR ( 5 ); |
|
|
for (i = 0; i < alphaSize; i++) { |
|
|
for (i = 0; i < alphaSize; i++) { |
|
|
while (bsR(1) == 1) { |
|
|
while (bsR(1) == 1) { |
|
|
if (bsR(1) == 0) { |
|
|
|
|
|
|
|
|
if (bsR(1) == 0) |
|
|
curr++; |
|
|
curr++; |
|
|
} else { |
|
|
|
|
|
|
|
|
else |
|
|
curr--; |
|
|
curr--; |
|
|
} |
|
|
|
|
|
} |
|
|
} |
|
|
len[t][i] = (char)curr; |
|
|
len[t][i] = (char)curr; |
|
|
} |
|
|
} |
|
|
@@ -478,12 +458,10 @@ public class CBZip2InputStream extends InputStream implements BZip2Constants { |
|
|
minLen = 32; |
|
|
minLen = 32; |
|
|
maxLen = 0; |
|
|
maxLen = 0; |
|
|
for (i = 0; i < alphaSize; i++) { |
|
|
for (i = 0; i < alphaSize; i++) { |
|
|
if (len[t][i] > maxLen) { |
|
|
|
|
|
|
|
|
if (len[t][i] > maxLen) |
|
|
maxLen = len[t][i]; |
|
|
maxLen = len[t][i]; |
|
|
} |
|
|
|
|
|
if (len[t][i] < minLen) { |
|
|
|
|
|
|
|
|
if (len[t][i] < minLen) |
|
|
minLen = len[t][i]; |
|
|
minLen = len[t][i]; |
|
|
} |
|
|
|
|
|
} |
|
|
} |
|
|
hbCreateDecodeTables(limit[t], base[t], perm[t], len[t], minLen, |
|
|
hbCreateDecodeTables(limit[t], base[t], perm[t], len[t], minLen, |
|
|
maxLen, alphaSize); |
|
|
maxLen, alphaSize); |
|
|
@@ -510,13 +488,11 @@ public class CBZip2InputStream extends InputStream implements BZip2Constants { |
|
|
in a separate pass, and so saves a block's worth of |
|
|
in a separate pass, and so saves a block's worth of |
|
|
cache misses. |
|
|
cache misses. |
|
|
*/ |
|
|
*/ |
|
|
for (i = 0; i <= 255; i++) { |
|
|
|
|
|
|
|
|
for (i = 0; i <= 255; i++) |
|
|
unzftab[i] = 0; |
|
|
unzftab[i] = 0; |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
for (i = 0; i <= 255; i++) { |
|
|
|
|
|
|
|
|
for (i = 0; i <= 255; i++) |
|
|
yy[i] = (char) i; |
|
|
yy[i] = (char) i; |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
last = -1; |
|
|
last = -1; |
|
|
|
|
|
|
|
|
@@ -560,20 +536,18 @@ public class CBZip2InputStream extends InputStream implements BZip2Constants { |
|
|
|
|
|
|
|
|
while(true) { |
|
|
while(true) { |
|
|
|
|
|
|
|
|
if (nextSym == EOB) { |
|
|
|
|
|
|
|
|
if (nextSym == EOB) |
|
|
break; |
|
|
break; |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (nextSym == RUNA || nextSym == RUNB) { |
|
|
if (nextSym == RUNA || nextSym == RUNB) { |
|
|
char ch; |
|
|
char ch; |
|
|
int s = -1; |
|
|
int s = -1; |
|
|
int N = 1; |
|
|
int N = 1; |
|
|
do { |
|
|
do { |
|
|
if (nextSym == RUNA) { |
|
|
|
|
|
|
|
|
if (nextSym == RUNA) |
|
|
s = s + (0+1) * N; |
|
|
s = s + (0+1) * N; |
|
|
} else if (nextSym == RUNB) { |
|
|
|
|
|
|
|
|
else if (nextSym == RUNB) |
|
|
s = s + (1+1) * N; |
|
|
s = s + (1+1) * N; |
|
|
} |
|
|
|
|
|
N = N * 2; |
|
|
N = N * 2; |
|
|
{ |
|
|
{ |
|
|
int zt, zn, zvec, zj; |
|
|
int zt, zn, zvec, zj; |
|
|
@@ -624,16 +598,14 @@ public class CBZip2InputStream extends InputStream implements BZip2Constants { |
|
|
s--; |
|
|
s--; |
|
|
}; |
|
|
}; |
|
|
|
|
|
|
|
|
if (last >= limitLast) { |
|
|
|
|
|
|
|
|
if (last >= limitLast) |
|
|
blockOverrun(); |
|
|
blockOverrun(); |
|
|
} |
|
|
|
|
|
continue; |
|
|
continue; |
|
|
} else { |
|
|
} else { |
|
|
char tmp; |
|
|
char tmp; |
|
|
last++; |
|
|
last++; |
|
|
if (last >= limitLast) { |
|
|
|
|
|
|
|
|
if (last >= limitLast) |
|
|
blockOverrun(); |
|
|
blockOverrun(); |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
tmp = yy[nextSym-1]; |
|
|
tmp = yy[nextSym-1]; |
|
|
unzftab[seqToUnseq[tmp]]++; |
|
|
unzftab[seqToUnseq[tmp]]++; |
|
|
@@ -653,9 +625,8 @@ public class CBZip2InputStream extends InputStream implements BZip2Constants { |
|
|
yy[j-2] = yy[j-3]; |
|
|
yy[j-2] = yy[j-3]; |
|
|
yy[j-3] = yy[j-4]; |
|
|
yy[j-3] = yy[j-4]; |
|
|
} |
|
|
} |
|
|
for (; j > 0; j--) { |
|
|
|
|
|
|
|
|
for (; j > 0; j--) |
|
|
yy[j] = yy[j-1]; |
|
|
yy[j] = yy[j-1]; |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
yy[0] = tmp; |
|
|
yy[0] = tmp; |
|
|
{ |
|
|
{ |
|
|
@@ -702,12 +673,10 @@ public class CBZip2InputStream extends InputStream implements BZip2Constants { |
|
|
char ch; |
|
|
char ch; |
|
|
|
|
|
|
|
|
cftab[0] = 0; |
|
|
cftab[0] = 0; |
|
|
for (i = 1; i <= 256; i++) { |
|
|
|
|
|
|
|
|
for (i = 1; i <= 256; i++) |
|
|
cftab[i] = unzftab[i-1]; |
|
|
cftab[i] = unzftab[i-1]; |
|
|
} |
|
|
|
|
|
for (i = 1; i <= 256; i++) { |
|
|
|
|
|
|
|
|
for (i = 1; i <= 256; i++) |
|
|
cftab[i] += cftab[i-1]; |
|
|
cftab[i] += cftab[i-1]; |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
for (i = 0; i <= last; i++) { |
|
|
for (i = 0; i <= last; i++) { |
|
|
ch = (char)ll8[i]; |
|
|
ch = (char)ll8[i]; |
|
|
@@ -786,9 +755,8 @@ public class CBZip2InputStream extends InputStream implements BZip2Constants { |
|
|
if (rNToGo == 0) { |
|
|
if (rNToGo == 0) { |
|
|
rNToGo = rNums[rTPos]; |
|
|
rNToGo = rNums[rTPos]; |
|
|
rTPos++; |
|
|
rTPos++; |
|
|
if(rTPos == 512) { |
|
|
|
|
|
|
|
|
if(rTPos == 512) |
|
|
rTPos = 0; |
|
|
rTPos = 0; |
|
|
} |
|
|
|
|
|
} |
|
|
} |
|
|
rNToGo--; |
|
|
rNToGo--; |
|
|
z ^= ((rNToGo == 1) ? 1 : 0); |
|
|
z ^= ((rNToGo == 1) ? 1 : 0); |
|
|
@@ -856,9 +824,8 @@ public class CBZip2InputStream extends InputStream implements BZip2Constants { |
|
|
|
|
|
|
|
|
blockSize100k = newSize100k; |
|
|
blockSize100k = newSize100k; |
|
|
|
|
|
|
|
|
if(newSize100k == 0) { |
|
|
|
|
|
|
|
|
if(newSize100k == 0) |
|
|
return; |
|
|
return; |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
int n = baseBlockSize * newSize100k; |
|
|
int n = baseBlockSize * newSize100k; |
|
|
ll8 = new char[n]; |
|
|
ll8 = new char[n]; |
|
|
|