else if idx < 280 { 7 }
else { 8 }
}
+ #[allow(clippy::identity_op)]
fn code(&mut self, idx: usize) -> u32 {
let base = idx as u32;
let bits = self.bits(idx);
buf: [u8; 65536],
bpos: usize,
output_idx: usize,
+ full_pos: usize,
state: InflateState,
final_block: bool,
buf: [0; 65536],
bpos: 0,
output_idx: 0,
+ full_pos: 0,
state: InflateState::Start,
final_block: false,
}
fn put_literal(&mut self, val: u8) {
self.buf[self.bpos] = val;
- self.bpos += 1;
+ self.bpos = (self.bpos + 1) & (self.buf.len() - 1);
+ self.full_pos += 1;
}
fn lz_copy(&mut self, offset: usize, len: usize, dst: &mut [u8]) -> DecompressResult<()> {
let mask = self.buf.len() - 1;
- if self.bpos < offset {
+ if offset > self.full_pos {
return Err(DecompressError::InvalidData);
}
- let cstart = (self.bpos - offset) & mask;
+ let cstart = (self.bpos.wrapping_sub(offset)) & mask;
for i in 0..len {
self.buf[(self.bpos + i) & mask] = self.buf[(cstart + i) & mask];
dst[i] = self.buf[(cstart + i) & mask];
}
- self.bpos += len;
+ self.bpos = (self.bpos + len) & mask;
+ self.full_pos += len;
Ok(())
}
///! Reports whether decoder has finished decoding the input.
///! [`DecompressError::ShortData`]: ../enum.DecompressError.html#variant.ShortData
///! [`DecompressError::OutputFull`]: ../enum.DecompressError.html#variant.OutputFull
pub fn decompress_data(&mut self, src: &[u8], dst: &mut [u8], continue_block: bool) -> DecompressResult<usize> {
- if src.len() == 0 || dst.len() == 0 {
+ if src.is_empty() || dst.is_empty() {
return Err(DecompressError::InvalidArgument);
}
let mut csrc = if !continue_block {
self.state = InflateState::End;
return Err(DecompressError::InvalidHeader);
}
- let rpt;
- if mode == 0 {
- if self.cur_len_idx == 0 {
- self.state = InflateState::End;
- return Err(DecompressError::InvalidHeader);
- }
- rpt = self.all_lengths[self.cur_len_idx - 1];
- } else {
- rpt = 0;
- }
+ let rpt = if mode == 0 {
+ if self.cur_len_idx == 0 {
+ self.state = InflateState::End;
+ return Err(DecompressError::InvalidHeader);
+ }
+ self.all_lengths[self.cur_len_idx - 1]
+ } else {
+ 0
+ };
for _ in 0..len {
self.all_lengths[self.cur_len_idx] = rpt;
self.cur_len_idx += 1;
///! Decompresses input data into output returning the uncompressed data length.
pub fn uncompress(src: &[u8], dst: &mut [u8]) -> DecompressResult<usize> {
let mut inflate = Self::new();
- inflate.decompress_data(src, dst, false)
+ let off = if src.len() > 2 && src[0] == 0x78 && src[1] == 0x9C { 2 } else { 0 };
+ inflate.decompress_data(&src[off..], dst, false)
+ }
+}
+
+impl Default for Inflate {
+ fn default() -> Self {
+ Self::new()
}
}
*codes = ShortCodebookDesc { code: 0, bits: 0 };
}
}
-
+
Ok(())
}
}
impl GzipCRC32 {
+ #[allow(clippy::unreadable_literal)]
fn new() -> Self {
let mut tab = [0u32; 256];
for i in 0..256 {