diff --git a/c_unpacker/unpack.c b/c_unpacker/unpack.c index e7643f3..c893d56 100644 --- a/c_unpacker/unpack.c +++ b/c_unpacker/unpack.c @@ -32,14 +32,18 @@ int upkr_decode_bit(int context_index) { int prob = upkr_probs[context_index]; int bit = (upkr_state & 255) < prob ? 1 : 0; - if(bit) { - upkr_state = prob * (upkr_state >> 8) + (upkr_state & 255); - upkr_probs[context_index] = prob + ((256 - prob + 8) >> 4); - } else { - upkr_state = (256 - prob) * (upkr_state >> 8) + (upkr_state & 255) - prob; - upkr_probs[context_index] = prob - ((prob + 8) >> 4); + int tmp = prob; + if(!bit) { + tmp = 256 - tmp; } - + upkr_state = tmp * (upkr_state >> 8) + (upkr_state & 255); + tmp += (256 - tmp + 8) >> 4; + if(!bit) { + upkr_state -= prob; + tmp = 256 - tmp; + } + upkr_probs[context_index] = tmp; + return bit; } diff --git a/src/main.rs b/src/main.rs index ae90eff..711cb32 100644 --- a/src/main.rs +++ b/src/main.rs @@ -16,7 +16,7 @@ fn main() -> Result<()> { let mut data = vec![]; File::open(infile)?.read_to_end(&mut data)?; - + let mut pb = pbr::ProgressBar::new(data.len() as u64); pb.set_units(pbr::Units::Bytes); let packed_data = upkr::pack( @@ -58,7 +58,10 @@ fn main() -> Result<()> { fn print_help() { eprintln!("Usage:"); - eprintln!(" upkr pack [-l level(0-9)] "); - eprintln!(" upkr unpack "); + eprintln!(" upkr pack [-b] [-l level(0-9)] "); + eprintln!(" upkr unpack [-b] "); + eprintln!(); + eprintln!(" -b, --bitstream bitstream mode"); + eprintln!(" -l, --level N compression level 0-9"); std::process::exit(1); }