edit in src/lib.rs at line 23
+ const SEEKABLE_NO_OUTPUT_PROGRESS_MAX: u32 = 16;
edit in src/lib.rs at line 30
+
+ const ZSTD_reset_session_only: c_uint = 1;
replacement in src/lib.rs at line 69
[3.1192]→[3.1192:1234](∅→∅) − c_offset: usize,
− d_offset: usize,
+ c_offset: u64,
+ d_offset: u64,
edit in src/lib.rs at line 84
+ inner_buf_size: Option<usize>,
edit in src/lib.rs at line 106
replacement in src/lib.rs at line 111
− DSizeTooSmall(usize, usize),
+ DSizeTooSmall(u64, u64),
replacement in src/lib.rs at line 123
− Error::Null => write!(fmt, "Null."),
+ Error::Null => write!(fmt, "Null pointer."),
replacement in src/lib.rs at line 129
− Error::Generic => write!(fmt, "Generic error from ZSTD."),
+ Error::Generic => write!(fmt, "Error (generic)."),
+ Error::SeekableIo => write!(fmt, "An I/O error occurred when reading/seeking."),
replacement in src/lib.rs at line 134
[3.1040]→[3.1040:1121](∅→∅) − "Frame parameter not supported. Expected at most {}, found {}.",
+ "Unsupported frame parameter. Expected at most {}, found {}.",
replacement in src/lib.rs at line 137
[3.1157]→[3.1157:1316](∅→∅) − Error::PrefixUnknown(p) => write!(fmt, "Prefix unknown {}", p),
− Error::Corruption(ref s) => write!(fmt, "Corruption detected {}.", s),
+ Error::PrefixUnknown(p) => write!(fmt, "Unknown frame descriptor {}", p),
+ Error::Corruption(ref s) => write!(fmt, "Corrupted block detected {}.", s),
replacement in src/lib.rs at line 141
[3.1387]→[3.1387:1466](∅→∅) − "Destination size too small. Expected at least {}, found {}.",
+ "Destination buffer is too small. Expected at least {}, found {}.",
replacement in src/lib.rs at line 322
[3.5878]→[3.5878:5935](∅→∅) − unsafe { ZSTD_resetCStream(self.cstream.p, 0) };
+ unsafe {
+ let r = ZSTD_CCtx_reset(self.cstream.p, ZSTD_reset_session_only);
+ if ZSTD_isError(r) != 0 {
+ return Err(Error::ZSTD(r));
+ }
+ };
replacement in src/lib.rs at line 523
[3.3514]→[3.3514:3587](∅→∅) − let mut seekable = Self::make_seekable(source, ptr::null_mut());
+ let mut seekable = Self::make_seekable(source, ptr::null_mut(), None);
replacement in src/lib.rs at line 528
[3.3650]→[3.207:277](∅→∅),
[3.207]→[3.207:277](∅→∅) − fn make_seekable(source: R, dstream: *mut ZSTD_DStream) -> Self {
+ fn make_seekable(source: R, dstream: *mut ZSTD_DStream, size: Option<usize>) -> Self {
edit in src/lib.rs at line 536
replacement in src/lib.rs at line 562
[3.9915]→[3.9915:9976](∅→∅),
[3.9976]→[3.3850:3898](∅→∅) − let checksum_flag = (self.in_buff[4] >> 7) as usize;
− if ((checksum_flag >> 2) & 0x1f) != 0 {
+ let sfd = self.in_buff[4];
+ let checksum_flag = (sfd >> 7) as usize;
+
+ if ((sfd >> 2) & 0x1f) != 0 {
replacement in src/lib.rs at line 617
[2.151]→[3.4779:4852](∅→∅),
[3.4779]→[3.4779:4852](∅→∅) − let a = slice_to_num(&self.in_buff[pos..pos + 4])? as usize;
+ let a = slice_to_num(&self.in_buff[pos..pos + 4])? as u64;
replacement in src/lib.rs at line 620
[3.12153]→[3.12153:12230](∅→∅) − d_offset += slice_to_num(&self.in_buff[pos..pos + 4])? as usize;
+ d_offset += slice_to_num(&self.in_buff[pos..pos + 4])? as u64;
replacement in src/lib.rs at line 651
[3.5125]→[2.152:200](∅→∅) − Err(Error::ZSTD(dstream_init));
+ Err(Error::ZSTD(dstream_init))
replacement in src/lib.rs at line 662
[3.13330]→[3.13330:13365](∅→∅),
[3.13365]→[3.5239:5299](∅→∅) − if dest.len() < dec_size {
− Err(Error::DSizeTooSmall(dest.len(), dec_size))
+ if (dest.len() as u64) < dec_size {
+ Err(Error::DSizeTooSmall(dest.len() as u64, dec_size))
replacement in src/lib.rs at line 665
[3.5316]→[3.5316:5471](∅→∅) − self.decompress(
− dest,
− dec_size,
− self.seek_table.entries[index].d_offset as u64,
− )
+ self.decompress(dest, dec_size, self.seek_table.entries[index].d_offset)
replacement in src/lib.rs at line 674
[3.255102]→[3.488:588](∅→∅) − pub fn decompress(&mut self, out: &mut [u8], len: usize, offset: u64) -> Result<usize, Error> {
+ pub fn decompress(&mut self, out: &mut [u8], len: u64, offset: u64) -> Result<usize, Error> {
+ let eos = self.seek_table.entries[self.seek_table.entries.len() - 1].d_offset;
+
+ let len = if offset + len > eos {
+ eos - offset
+ } else {
+ len
+ };
+
edit in src/lib.rs at line 684
+ let mut no_output_progress_c = 0u32;
+ let mut src_bytes_read = 0usize;
replacement in src/lib.rs at line 689
[3.13942]→[3.13942:14037](∅→∅) − self.decompressed_offset = self.seek_table.entries[tgt_frame].d_offset as u64;
+ self.decompressed_offset = self.seek_table.entries[tgt_frame].d_offset;
replacement in src/lib.rs at line 693
[3.14140]→[3.14140:14212](∅→∅) − self.seek_table.entries[tgt_frame].c_offset as u64,
+ self.seek_table.entries[tgt_frame].c_offset,
edit in src/lib.rs at line 701
replacement in src/lib.rs at line 703
[3.14486]→[3.14486:14546](∅→∅) − unsafe { ZSTD_resetDStream(self.dstream) };
+
+ unsafe {
+ let r = ZSTD_DCtx_reset(self.dstream, ZSTD_reset_session_only);
+ if ZSTD_isError(r) != 0 {
+ return Err(Error::ZSTD(r));
+ }
+ }
+
+ if let Some(size) = &self.inner_buf_size {
+ if src_bytes_read > *size {
+ return Err(Error::SeekableIo);
+ }
+ }
replacement in src/lib.rs at line 736
replacement in src/lib.rs at line 743
[3.15305]→[3.15305:15353](∅→∅) − let prev_out_pos = out_tmp.pos;
+ let (prev_out_pos, prev_in_pos) = (out_tmp.pos, self.inn.pos);
replacement in src/lib.rs at line 760
[3.16094]→[3.16094:16175](∅→∅) − self.decompressed_offset += (out_tmp.pos - prev_out_pos) as u64;
+ let forward_progress = (out_tmp.pos - prev_out_pos) as u64;
+
+ if forward_progress == 0 {
+ no_output_progress_c += 1;
+ if no_output_progress_c > SEEKABLE_NO_OUTPUT_PROGRESS_MAX {
+ return Err(Error::SeekableIo);
+ }
+ } else {
+ no_output_progress_c = 0;
+ }
+ self.decompressed_offset += forward_progress;
+ src_bytes_read += self.inn.pos - prev_in_pos;
+
edit in src/lib.rs at line 783
+ // assert!(tgt_frame != self.seek_table.entries.len());
replacement in src/lib.rs at line 803
[3.17340]→[3.17340:17356](∅→∅) edit in src/lib.rs at line 815
+ let size = (&input).len();
replacement in src/lib.rs at line 817
− let mut seekable = Seekable::make_seekable(source, dstream);
+ let mut seekable = Seekable::make_seekable(source, dstream, Some(size));
replacement in src/lib.rs at line 827
[3.1020]→[3.18558:18635](∅→∅),
[3.18558]→[3.18558:18635](∅→∅) − let mut seekable = Seekable::make_seekable(source, ptr::null_mut());
+ let mut seekable = Seekable::make_seekable(source, ptr::null_mut(), None);
replacement in src/lib.rs at line 839
[3.255716]→[3.255716:255768](∅→∅),
[3.255768]→[3.18899:18991](∅→∅) − /// Offset of the frame in the compressed data.
− pub fn get_frame_compressed_offset(&self, frame_index: usize) -> Result<usize, Error> {
+
+ #[inline(always)]
+ fn get_frame(&'_ self, frame_index: usize) -> Result<&'_ SeekEntry, Error> {
replacement in src/lib.rs at line 846
[3.19110]→[3.19110:19172](∅→∅) − Ok(self.seek_table.entries[frame_index].c_offset)
+ Ok(&self.seek_table.entries[frame_index])
edit in src/lib.rs at line 848
+ }
+
+ /// Offset of the frame in the compressed data.
+ pub fn get_frame_compressed_offset(&self, frame_index: usize) -> Result<u64, Error> {
+ Ok(self.get_frame(frame_index)?.c_offset)
replacement in src/lib.rs at line 855
[3.255991]→[3.19183:19273](∅→∅),
[3.19273]→[3.6238:6389](∅→∅),
[3.6389]→[3.19375:19532](∅→∅),
[3.19375]→[3.19375:19532](∅→∅) − pub fn get_frame_compressed_size(&self, frame_index: usize) -> Result<usize, Error> {
− let max_frames = self.get_num_frames();
− if frame_index >= max_frames {
− Err(Error::FIndexTooLarge(frame_index, max_frames))
− } else {
− Ok(self.seek_table.entries[frame_index + 1].c_offset
− - self.seek_table.entries[frame_index].c_offset)
− }
+ pub fn get_frame_compressed_size(&self, frame_index: usize) -> Result<u64, Error> {
+ let entry = self.get_frame(frame_index)?;
+ Ok(self.seek_table.entries[frame_index + 1].c_offset - entry.c_offset)
replacement in src/lib.rs at line 860
[3.256222]→[3.19533:19627](∅→∅),
[3.19627]→[3.6390:6541](∅→∅),
[3.6541]→[3.19729:19818](∅→∅),
[3.19729]→[3.19729:19818](∅→∅) − pub fn get_frame_decompressed_offset(&self, frame_index: usize) -> Result<usize, Error> {
− let max_frames = self.get_num_frames();
− if frame_index >= max_frames {
− Err(Error::FIndexTooLarge(frame_index, max_frames))
− } else {
− Ok(self.seek_table.entries[frame_index].d_offset)
− }
+ pub fn get_frame_decompressed_offset(&self, frame_index: usize) -> Result<u64, Error> {
+ Ok(self.get_frame(frame_index)?.d_offset)
replacement in src/lib.rs at line 864
[3.256448]→[3.19819:19911](∅→∅),
[3.19911]→[3.6542:6693](∅→∅),
[3.6693]→[3.20012:20029](∅→∅),
[3.20012]→[3.20012:20029](∅→∅),
[3.20029]→[3.6694:6764](∅→∅),
[3.6764]→[2.1173:1238](∅→∅),
[2.1238]→[3.6825:6843](∅→∅),
[3.6825]→[3.6825:6843](∅→∅),
[3.6843]→[3.257079:257089](∅→∅),
[3.20159]→[3.257079:257089](∅→∅),
[3.257079]→[3.257079:257089](∅→∅) − pub fn get_frame_decompressed_size(&self, frame_index: usize) -> Result<usize, Error> {
− let max_frames = self.get_num_frames();
− if frame_index >= max_frames {
− Err(Error::FIndexTooLarge(frame_index, max_frames))
− } else {
− let r = self.seek_table.entries[frame_index + 1].d_offset
− - self.seek_table.entries[frame_index].d_offset;
− Ok(r)
− }
+ pub fn get_frame_decompressed_size(&self, frame_index: usize) -> Result<u64, Error> {
+ let entry = self.get_frame(frame_index)?;
+ Ok(self.seek_table.entries[frame_index + 1].d_offset - entry.d_offset)
replacement in src/lib.rs at line 870
[3.20233]→[3.20233:20319](∅→∅) − if offset >= self.seek_table.entries[self.get_num_frames()].d_offset as u64 {
+ if offset >= self.seek_table.entries[self.get_num_frames()].d_offset {
replacement in src/lib.rs at line 878
[3.20505]→[3.20505:20577](∅→∅) − if self.seek_table.entries[mid].d_offset as u64 <= offset {
+ if self.seek_table.entries[mid].d_offset <= offset {
replacement in src/lib.rs at line 1158
[3.263511]→[3.63:129](∅→∅) − let size = s.get_frame_decompressed_size(frame).unwrap();
+ let size = s.get_frame_decompressed_size(frame).unwrap() as usize;
replacement in src/lib.rs at line 1161
[3.263654]→[3.8594:8724](∅→∅) − if let Err(_) = s.decompress_frame(&mut decomp[n..], frame) {
− println!("Error in frame {}", frame);
− }
+ s.decompress_frame(&mut decomp[n..], frame).unwrap();
replacement in src/lib.rs at line 1199
[3.3453]→[3.3453:3519](∅→∅) − let size = s.get_frame_decompressed_size(frame).unwrap();
+ let size = s.get_frame_decompressed_size(frame).unwrap() as usize;
replacement in src/bindings.rs at line 1
[3.1612]→[3.26406:26469](∅→∅) − use libc::{c_char, c_int, c_longlong, c_uint, c_void, size_t};
+ use libc::{c_char, c_int, c_uint, c_void, size_t};
replacement in src/bindings.rs at line 52
[3.3576]→[3.26470:26552](∅→∅) − pub fn ZSTD_resetCStream(zcs: *mut ZSTD_CStream, pledgedSrcSize: c_longlong);
+ pub fn ZSTD_CCtx_reset(cctx: *mut ZSTD_CStream, reset: c_uint) -> size_t;
replacement in src/bindings.rs at line 66
[3.4179]→[3.26553:26617](∅→∅) − pub fn ZSTD_resetDStream(zds: *mut ZSTD_DStream) -> size_t;
+ pub fn ZSTD_DCtx_reset(dctx: *mut ZSTD_DStream, reset: c_uint) -> size_t;