Skip to content
Merged
Show file tree
Hide file tree
Changes from 6 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions libbz2-rs-sys/src/bzlib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -557,7 +557,7 @@ pub(crate) struct DState {
pub len: [[u8; 258]; 6],
pub limit: [[i32; 258]; 6],
pub base: [[i32; 258]; 6],
pub perm: [[i32; 258]; 6],
pub perm: [[u16; 258]; 6],
pub minLens: [u8; 6],
pub save: SaveArea,
}
Expand All @@ -571,12 +571,12 @@ pub(crate) struct SaveArea {
pub alphaSize: u16,
pub EOB: u16,
pub groupNo: i32,
pub groupPos: u8,
pub nextSym: i32,
pub nblock: u32,
pub es: i32,
pub zvec: i32,
pub nextSym: u16,
pub nSelectors: u16,
pub groupPos: u8,
pub zn: u8,
pub nGroups: u8,
pub curr: u8,
Expand Down
167 changes: 86 additions & 81 deletions libbz2-rs-sys/src/decompress.rs
Original file line number Diff line number Diff line change
Expand Up @@ -785,7 +785,7 @@ pub(crate) fn decompress(
Some(&nextSym) => nextSym,
None => error!(BZ_DATA_ERROR),
};
if nextSym == BZ_RUNA as i32 || nextSym == BZ_RUNB as i32 {
if nextSym == BZ_RUNA || nextSym == BZ_RUNB {
current_block = Block46;
} else {
es += 1;
Expand Down Expand Up @@ -842,90 +842,30 @@ pub(crate) fn decompress(
_ => {}
}
if current_block == Block40 {
if nextSym == EOB as i32 {
if nextSym == EOB {
current_block = Block41;
} else if nextSym == BZ_RUNA || nextSym == BZ_RUNB {
es = -1;
logN = 0;
current_block = Block46;
} else if nblock >= 100000 * nblockMAX100k as u32 {
error!(BZ_DATA_ERROR);
} else {
if nextSym == 0 || nextSym == 1 {
es = -1;
logN = 0;
} else if nblock >= 100000 * nblockMAX100k as u32 {
error!(BZ_DATA_ERROR);
} else {
let mut ii_0: i32;
let mut jj_0: i32;
let mut kk_0: i32;
let mut pp: i32;
let mut lno: i32;
let off: i32;
let mut nn: u32;
nn = (nextSym - 1) as u32;
if nn < 16 {
pp = s.mtfbase[0_usize];
uc = s.mtfa[(pp as c_uint).wrapping_add(nn) as usize];
while nn > 3 {
let z: i32 = (pp as c_uint).wrapping_add(nn) as i32;
s.mtfa[z as usize] = s.mtfa[(z - 1) as usize];
s.mtfa[(z - 1) as usize] = s.mtfa[(z - 2) as usize];
s.mtfa[(z - 2) as usize] = s.mtfa[(z - 3) as usize];
s.mtfa[(z - 3) as usize] = s.mtfa[(z - 4) as usize];
nn = (nn).wrapping_sub(4);
}
while nn > 0 {
s.mtfa[(pp as c_uint).wrapping_add(nn) as usize] = s.mtfa
[(pp as c_uint).wrapping_add(nn).wrapping_sub(1) as usize];
nn = nn.wrapping_sub(1);
}
s.mtfa[pp as usize] = uc;
} else {
lno = nn.wrapping_div(16) as i32;
off = nn.wrapping_rem(16) as i32;
pp = s.mtfbase[lno as usize] + off;
uc = s.mtfa[pp as usize];
while pp > s.mtfbase[lno as usize] {
s.mtfa[pp as usize] = s.mtfa[(pp - 1) as usize];
pp -= 1;
}
s.mtfbase[lno as usize] += 1;
while lno > 0 {
s.mtfbase[lno as usize] -= 1;
s.mtfa[s.mtfbase[lno as usize] as usize] =
s.mtfa[(s.mtfbase[(lno - 1) as usize] + 16 - 1) as usize];
lno -= 1;
}
s.mtfbase[0_usize] -= 1;
s.mtfa[s.mtfbase[0_usize] as usize] = uc;
if s.mtfbase[0_usize] == 0 {
kk_0 = 4096 - 1;
ii_0 = 256 / 16 - 1;
while ii_0 >= 0 {
jj_0 = 16 - 1;
while jj_0 >= 0 {
s.mtfa[kk_0 as usize] =
s.mtfa[(s.mtfbase[ii_0 as usize] + jj_0) as usize];
kk_0 -= 1;
jj_0 -= 1;
}
s.mtfbase[ii_0 as usize] = kk_0 + 1;
ii_0 -= 1;
}
}
uc = initialize_mtfa(&mut s.mtfa, &mut s.mtfbase, nextSym);
s.unzftab[s.seqToUnseq[uc as usize] as usize] += 1;
match s.smallDecompress {
DecompressMode::Small => {
ll16[nblock as usize] = s.seqToUnseq[uc as usize] as u16
}
s.unzftab[s.seqToUnseq[uc as usize] as usize] += 1;
match s.smallDecompress {
DecompressMode::Small => {
ll16[nblock as usize] = s.seqToUnseq[uc as usize] as u16
}
DecompressMode::Fast => {
tt[nblock as usize] = s.seqToUnseq[uc as usize] as u32
}
DecompressMode::Fast => {
tt[nblock as usize] = s.seqToUnseq[uc as usize] as u32
}
nblock += 1;
update_group_pos!(s);
zn = gMinlen;
current_block = BZ_X_MTF_5;
continue;
}
current_block = Block46;
nblock += 1;
update_group_pos!(s);
zn = gMinlen;
current_block = BZ_X_MTF_5;
continue;
}
match current_block {
Block46 => {}
Expand Down Expand Up @@ -1116,7 +1056,7 @@ pub(crate) fn decompress(
if logN >= LOG_2MB {
error!(BZ_DATA_ERROR);
} else {
let mul = match nextSym as u16 {
let mul = match nextSym {
BZ_RUNA => 1,
BZ_RUNB => 2,
_ => 0,
Expand Down Expand Up @@ -1254,6 +1194,7 @@ pub(crate) fn decompress(

/*--- Create the Huffman decoding tables ---*/
for t in 0..nGroups as usize {
// NOTE: s.nInUse <= 256, alphaSize <= 258
let len = &s.len[t][..alphaSize as usize];

let mut minLen = 32u8;
Expand Down Expand Up @@ -1332,3 +1273,67 @@ pub(crate) fn decompress(

ret_val
}

fn initialize_mtfa(mtfa: &mut [u8; 4096], mtfbase: &mut [i32; 16], nextSym: u16) -> u8 {
let mut nn = (nextSym - 1) as u32;
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

u32::from(nextSym - 1)


if nn < MTFL_SIZE as u32 {
let pp = mtfbase[0_usize];
let uc = mtfa[(pp as c_uint).wrapping_add(nn) as usize];
while nn > 3 {
let z: i32 = (pp as c_uint).wrapping_add(nn) as i32;
mtfa[z as usize] = mtfa[(z - 1) as usize];
mtfa[(z - 1) as usize] = mtfa[(z - 2) as usize];
mtfa[(z - 2) as usize] = mtfa[(z - 3) as usize];
mtfa[(z - 3) as usize] = mtfa[(z - 4) as usize];
nn = (nn).wrapping_sub(4);
}
while nn > 0 {
mtfa[(pp as c_uint).wrapping_add(nn) as usize] =
mtfa[(pp as c_uint).wrapping_add(nn).wrapping_sub(1) as usize];
nn = nn.wrapping_sub(1);
}
mtfa[pp as usize] = uc;

uc
} else {
let mut lno = nn.wrapping_div(16);
let off = nn.wrapping_rem(16);
let mut pp = mtfbase[lno as usize] + off as i32;
let uc = mtfa[pp as usize];
while pp > mtfbase[lno as usize] {
mtfa[pp as usize] = mtfa[(pp - 1) as usize];
pp -= 1;
}
mtfbase[lno as usize] += 1;
while lno > 0 {
mtfbase[lno as usize] -= 1;
mtfa[mtfbase[lno as usize] as usize] =
mtfa[(mtfbase[(lno - 1) as usize] + 16 - 1) as usize];
lno -= 1;
}
mtfbase[0_usize] -= 1;
mtfa[mtfbase[0_usize] as usize] = uc;

let mut ii_0: i32;
let mut jj_0: i32;
let mut kk_0: i32;

if mtfbase[0_usize] == 0 {
kk_0 = 4096 - 1;
ii_0 = 256 / 16 - 1;
while ii_0 >= 0 {
jj_0 = 16 - 1;
while jj_0 >= 0 {
mtfa[kk_0 as usize] = mtfa[(mtfbase[ii_0 as usize] + jj_0) as usize];
kk_0 -= 1;
jj_0 -= 1;
}
mtfbase[ii_0 as usize] = kk_0 + 1;
ii_0 -= 1;
}
}

uc
}
}
10 changes: 6 additions & 4 deletions libbz2-rs-sys/src/huffman.rs
Original file line number Diff line number Diff line change
Expand Up @@ -176,18 +176,20 @@ pub(crate) fn assign_codes(

#[inline(always)]
pub(crate) fn create_decode_tables(
limit: &mut [i32],
base: &mut [i32],
perm: &mut [i32],
limit: &mut [i32; 258],
base: &mut [i32; 258],
perm: &mut [u16; 258],
length: &[u8],
minLen: u8,
maxLen: u8,
) {
assert!(length.len() <= 258);

let mut pp: i32 = 0;
for i in minLen..=maxLen {
for (j, e) in length.iter().enumerate() {
if *e == i {
perm[pp as usize] = j as i32;
perm[pp as usize] = j as u16;
pp += 1;
}
}
Expand Down