Coverage Report

Created: 2025-11-16 06:16

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/rust/registry/src/index.crates.io-1949cf8c6b5b557f/flate2-1.1.5/src/ffi/mod.rs
Line
Count
Source
1
//! This module contains backend-specific code.
2
3
use crate::mem::{CompressError, DecompressError, FlushCompress, FlushDecompress, Status};
4
use crate::Compression;
5
use std::mem::MaybeUninit;
6
7
303M
fn initialize_buffer(output: &mut [MaybeUninit<u8>]) -> &mut [u8] {
8
    // SAFETY: Here we zero-initialize the output and cast it to [u8]
9
303M
    unsafe {
10
303M
        output.as_mut_ptr().write_bytes(0, output.len());
11
303M
        &mut *(output as *mut [MaybeUninit<u8>] as *mut [u8])
12
303M
    }
13
303M
}
14
15
/// Traits specifying the interface of the backends.
16
///
17
/// Sync + Send are added as a condition to ensure they are available
18
/// for the frontend.
19
pub trait Backend: Sync + Send {
20
    fn total_in(&self) -> u64;
21
    fn total_out(&self) -> u64;
22
}
23
24
pub trait InflateBackend: Backend {
25
    fn make(zlib_header: bool, window_bits: u8) -> Self;
26
    fn decompress(
27
        &mut self,
28
        input: &[u8],
29
        output: &mut [u8],
30
        flush: FlushDecompress,
31
    ) -> Result<Status, DecompressError>;
32
0
    fn decompress_uninit(
33
0
        &mut self,
34
0
        input: &[u8],
35
0
        output: &mut [MaybeUninit<u8>],
36
0
        flush: FlushDecompress,
37
0
    ) -> Result<Status, DecompressError> {
38
0
        self.decompress(input, initialize_buffer(output), flush)
39
0
    }
40
    fn reset(&mut self, zlib_header: bool);
41
}
42
43
pub trait DeflateBackend: Backend {
44
    fn make(level: Compression, zlib_header: bool, window_bits: u8) -> Self;
45
    fn compress(
46
        &mut self,
47
        input: &[u8],
48
        output: &mut [u8],
49
        flush: FlushCompress,
50
    ) -> Result<Status, CompressError>;
51
303M
    fn compress_uninit(
52
303M
        &mut self,
53
303M
        input: &[u8],
54
303M
        output: &mut [MaybeUninit<u8>],
55
303M
        flush: FlushCompress,
56
303M
    ) -> Result<Status, CompressError> {
57
303M
        self.compress(input, initialize_buffer(output), flush)
58
303M
    }
59
    fn reset(&mut self);
60
}
61
62
// Default to Rust implementation unless explicitly opted in to a different backend.
63
#[cfg(feature = "any_zlib")]
64
mod c;
65
#[cfg(feature = "any_zlib")]
66
pub use self::c::*;
67
68
#[cfg(all(not(feature = "any_zlib"), feature = "miniz_oxide"))]
69
mod rust;
70
#[cfg(all(not(feature = "any_zlib"), feature = "miniz_oxide"))]
71
pub use self::rust::*;
72
73
impl std::fmt::Debug for ErrorMessage {
74
0
    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
75
0
        self.get().fmt(f)
76
0
    }
77
}