compression_codecs/xz2/
mod.rs

1mod decoder;
2mod encoder;
3
4#[derive(Debug)]
5pub enum Xz2FileFormat {
6    Xz,
7    Lzma,
8}
9
10pub use self::{decoder::Xz2Decoder, encoder::Xz2Encoder};
11
12use compression_core::util::{PartialBuffer, WriteBuffer};
13use liblzma::stream::{Action, Status, Stream};
14use std::io;
15
16/// Return `Ok(true)` if stream ends.
17fn process_stream(
18    stream: &mut Stream,
19    input: &mut PartialBuffer<&[u8]>,
20    output: &mut WriteBuffer<'_>,
21    action: Action,
22) -> io::Result<bool> {
23    let previous_in = stream.total_in() as usize;
24    let previous_out = stream.total_out() as usize;
25
26    // Safety: We **trust** liblzma to not write uninitialized bytes into the buffer
27    let res = stream.process_uninit(input.unwritten(), unsafe { output.unwritten_mut() }, action);
28
29    input.advance(stream.total_in() as usize - previous_in);
30    // Safety: We **trust** liblzma to write bytes into the buffer properly
31    unsafe { output.assume_init_and_advance(stream.total_out() as usize - previous_out) };
32
33    match res? {
34        Status::Ok => Ok(false),
35        Status::StreamEnd => Ok(true),
36        Status::GetCheck => Err(io::Error::other("Unexpected lzma integrity check")),
37        Status::MemNeeded => Err(io::ErrorKind::OutOfMemory.into()),
38    }
39}