Skip to main content

ms_pdb/
taster.rs

1//! Determines whether a given file header is a PDB/MSF file, PDBZ/MSFZ file, or a Portable PDB file.
2
3use sync_file::ReadAt;
4
5/// Enumerates the kind of PDBs files that are recognized.
6#[derive(Copy, Clone, Eq, PartialEq)]
7pub enum Flavor {
8    /// An ordinary PDB file.
9    Pdb,
10    /// A compressed PDB (PDZ) file.
11    Pdz,
12    /// A "Portable PDB" file.
13    PortablePdb,
14}
15
16/// Determines whether a given file header is a PDB/MSF file, PDBZ/MSFZ file, or a Portable PDB file.
17pub fn what_flavor<F: ReadAt>(f: &F) -> Result<Option<Flavor>, std::io::Error> {
18    let mut header = [0u8; 0x100];
19    let _n = f.read_at(&mut header, 0)?;
20    if ms_pdb_msf::is_file_header_msf(&header) {
21        Ok(Some(Flavor::Pdb))
22    } else if ms_pdb_msfz::is_header_msfz(&header) {
23        Ok(Some(Flavor::Pdz))
24    } else if is_header_portable_pdb(&header) {
25        Ok(Some(Flavor::PortablePdb))
26    } else {
27        Ok(None)
28    }
29}
30
31fn is_header_portable_pdb(header: &[u8]) -> bool {
32    header.len() >= 24 && header[16..24] == *b"PDB v1.0"
33}