diff --git a/Cargo.toml b/Cargo.toml index 469f25a..7bde752 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "upkr" -version = "0.2.0-pre1" +version = "0.2.0-pre2" edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/src/lib.rs b/src/lib.rs index 52a19c5..25b089d 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -20,6 +20,8 @@ pub struct Config { pub bitstream_is_big_endian: bool, pub simplified_prob_update: bool, + + pub no_repeated_offsets: bool, } impl Default for Config { @@ -35,6 +37,8 @@ impl Default for Config { bitstream_is_big_endian: false, simplified_prob_update: false, + + no_repeated_offsets: false, } } } diff --git a/src/lz.rs b/src/lz.rs index f3b2770..8ca8cd3 100644 --- a/src/lz.rs +++ b/src/lz.rs @@ -25,7 +25,7 @@ impl Op { } &Op::Match { offset, len } => { encode_bit(coder, state, literal_base, config.is_match_bit); - if !state.prev_was_match { + if !state.prev_was_match && !config.no_repeated_offsets { encode_bit( coder, state, @@ -33,9 +33,9 @@ impl Op { (offset != state.last_offset) == config.new_offset_bit, ); } else { - assert!(offset != state.last_offset); + assert!(offset != state.last_offset || config.no_repeated_offsets); } - if offset != state.last_offset { + if offset != state.last_offset || config.no_repeated_offsets { encode_length( coder, state, @@ -156,7 +156,8 @@ pub fn unpack(packed_data: &[u8], config: Config) -> Vec { if decoder.decode_with_context(&mut contexts.context_mut(literal_base)) == config.is_match_bit { - if prev_was_match + if config.no_repeated_offsets + || prev_was_match || decoder .decode_with_context(&mut contexts.context_mut(256 * config.parity_contexts)) == config.new_offset_bit diff --git a/src/main.rs b/src/main.rs index ea6b20a..7dfe8ff 100644 --- a/src/main.rs +++ b/src/main.rs @@ -28,6 +28,7 @@ fn main() -> Result<()> { config.use_bitstream = true; config.bitstream_is_big_endian = true; } + Long("no-repeated-offsets") => config.no_repeated_offsets = true, Long("z80") => { config.use_bitstream = true;