Add binary for file compression and decompression
This commit is contained in:
parent
96415385ef
commit
3fab061972
@ -76,7 +76,6 @@ impl<R: Read> BitReader<R> {
|
||||
} else if self.repeat_bits <= 0 {
|
||||
return Err(io::Error::other("No more bits"));
|
||||
} else {
|
||||
println!("{}", self.repeat_bits);
|
||||
self.repeat_bits -= 8;
|
||||
}
|
||||
self.next = 1 << 7;
|
||||
|
||||
51
src/main.rs
Normal file
51
src/main.rs
Normal file
@ -0,0 +1,51 @@
|
||||
use std::{
|
||||
env,
|
||||
fs::File,
|
||||
io::{self, BufReader, Read},
|
||||
path::Path,
|
||||
};
|
||||
|
||||
use sac::modelA::ModelA;
|
||||
|
||||
enum Mode {
|
||||
Compress,
|
||||
Decompress,
|
||||
}
|
||||
type CodeValue = u32;
|
||||
|
||||
fn get_file<FilePath: AsRef<Path>>(filepath: FilePath) -> io::Result<Box<dyn Read>> {
|
||||
let f = File::open(&filepath)?;
|
||||
Ok(Box::new(BufReader::new(f)))
|
||||
}
|
||||
|
||||
fn main() -> io::Result<()> {
|
||||
let args: Vec<String> = env::args().collect();
|
||||
let name = &args[0];
|
||||
|
||||
let (input, mode): (Box<dyn Read>, Mode) = match args.len() {
|
||||
2 if args[1].to_lowercase() == "compress" => (Box::new(io::stdin()), Mode::Compress),
|
||||
2 if args[1].to_lowercase() == "decompress" => (Box::new(io::stdin()), Mode::Decompress),
|
||||
|
||||
3 if args[1].to_lowercase() == "compress" => (get_file(&args[2])?, Mode::Compress),
|
||||
3 if args[1].to_lowercase() == "decompress" => (get_file(&args[2])?, Mode::Decompress),
|
||||
|
||||
_ => {
|
||||
eprintln!("Usage:");
|
||||
eprintln!("{name} compress file > output # compress file and save to output");
|
||||
eprintln!("{name} decompress file > output # decompress file and save to output");
|
||||
return Err(io::Error::other(format!(
|
||||
"Invalid command `{}`",
|
||||
args.join(" ")
|
||||
)));
|
||||
}
|
||||
};
|
||||
|
||||
let model: ModelA<CodeValue> = ModelA::default();
|
||||
let mut output = io::stdout().lock();
|
||||
match mode {
|
||||
Mode::Compress => model.compress(input, &mut output)?,
|
||||
Mode::Decompress => model.decompress(input, &mut output)?,
|
||||
};
|
||||
|
||||
Ok(())
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user