diff --git a/src/greedy_packer.rs b/src/greedy_packer.rs index d31fa08..4e7d271 100644 --- a/src/greedy_packer.rs +++ b/src/greedy_packer.rs @@ -1,14 +1,18 @@ use crate::lz; use crate::match_finder::MatchFinder; use crate::rans::RansCoder; +use crate::ProgressCallback; -pub fn pack(data: &[u8]) -> Vec { +pub fn pack(data: &[u8], mut progress_callback: Option) -> Vec { let mut match_finder = MatchFinder::new(data); let mut rans_coder = RansCoder::new(); let mut state = lz::CoderState::new(); let mut pos = 0; while pos < data.len() { + if let Some(ref mut cb) = progress_callback { + cb(pos); + } let mut encoded_match = false; if let Some(m) = match_finder.matches(pos).next() { let max_offset = 1 << (m.length * 3 - 1).min(31); diff --git a/src/lib.rs b/src/lib.rs index b8db242..d5153b8 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -5,8 +5,14 @@ mod match_finder; mod rans; mod parsing_packer; -pub use greedy_packer::pack as pack_fast; -pub use parsing_packer::pack; pub use lz::unpack; -pub type ProgressCallback<'a> = &'a mut dyn FnMut(usize); \ No newline at end of file +pub type ProgressCallback<'a> = &'a mut dyn FnMut(usize); + +pub fn pack(data: &[u8], level: u8, progress_callback: Option) -> Vec { + if level == 0 { + greedy_packer::pack(data, progress_callback) + } else { + parsing_packer::pack(data, level, progress_callback) + } +} diff --git a/src/main.rs b/src/main.rs index bba8243..4a669bb 100644 --- a/src/main.rs +++ b/src/main.rs @@ -15,21 +15,18 @@ fn main() -> Result<()> { let mut data = vec![]; File::open(infile)?.read_to_end(&mut data)?; - let packed_data = if level == 0 { - upkr::pack_fast(&data) - } else { - let mut pb = pbr::ProgressBar::new(data.len() as u64); - pb.set_units(pbr::Units::Bytes); - let packed_data = upkr::pack( - &data, - level, - Some(&mut |pos| { - pb.set(pos as u64); - }), - ); - pb.finish(); - packed_data - }; + + let mut pb = pbr::ProgressBar::new(data.len() as u64); + pb.set_units(pbr::Units::Bytes); + let packed_data = upkr::pack( + &data, + level, + Some(&mut |pos| { + pb.set(pos as u64); + }), + ); + pb.finish(); + println!( "Compressed {} bytes to {} bytes ({}%)", data.len(), @@ -57,7 +54,7 @@ fn main() -> Result<()> { fn print_help() { eprintln!("Usage:"); - eprintln!(" upkr pack "); + eprintln!(" upkr pack [-l level(0-9)] "); eprintln!(" upkr unpack "); std::process::exit(1); }