1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
//! # Segmented Index Files (si0)
use std::fmt;
use crate::md5::MD5Sum;
/// The first line is a header of the following form:
///
/// ```py
/// '%s%s:%08x:%s:%08x\r'
/// ```
///
/// with the following data:
pub struct HeaderLine {
/// 1) the file extension `si0` and magic bytes 0x01, 0xff as `\x01\xff`
pub magic: &'static str,
/// 2) the total size of the input
pub raw_size: u32,
/// 3) the MD5 hash of the input
pub raw_hash: MD5Sum,
/// 4) the segment size
pub segment_size: u32,
}
impl fmt::Display for HeaderLine {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(
f,
"{}:{:08x}:{}:{:08x}",
self.magic, self.raw_size, self.raw_hash, self.segment_size
)
}
}
/// The rest of the file is one line for every compressed block, in the following form:
///
/// ```py
/// %08x:%08x:%s:%s:%08x:%08x:%s
/// ```
///
/// with the following data:
pub struct SegmentLine {
/// 1) start of the block in the raw file
pub start: u32,
/// 2) size of the block
pub size: u32,
/// 3) Adler32 of the raw bytes modulo 0xFFFFFFFF, as hex, with the last letter removed
pub adler: u32,
/// 4) MD5 hash of the raw bytes
pub raw_hash: MD5Sum,
/// 5) number of bytes already written to compressed file (without magic bytes)
pub compressed_start: u32,
/// 6) number of compressed bytes
pub compressed_size: u32,
/// 7) MD5 hash of compressed bytes
pub compressed_hash: MD5Sum,
}
impl fmt::Display for SegmentLine {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(
f,
"{:08x}:{:08x}:{:x}:{}:{:08x}:{:08x}:{}",
self.start,
self.size,
(self.adler % 0xFFFFFFFF) >> 4,
self.raw_hash,
self.compressed_start,
self.compressed_size,
self.compressed_hash
)
}
}