use core::mem;
use scroll::Pread;
#[derive(PartialEq, Debug, Pread)]
#[repr(C)]
pub struct Directory {
pub characteristics: u32,
pub time_date_stamp: u32,
pub major_version: u16,
pub minor_version: u16,
pub number_of_named_entries: u16,
pub number_of_id_entries: u16,
}
impl Directory {
pub fn total_entries(&self) -> usize {
(self.number_of_named_entries + self.number_of_id_entries) as usize
}
pub fn size_in_bytes(&self) -> usize {
mem::size_of::<Self>() + self.total_entries() * mem::size_of::<DirectoryEntry>()
}
}
#[derive(PartialEq, Debug, Pread)]
#[repr(C)]
pub struct DirectoryString {
pub length: u16,
}
#[derive(PartialEq, Debug, Pread)]
#[repr(C)]
pub struct DataEntry {
pub offset_to_data: u32,
pub size: u32,
pub code_page: u32,
pub reserved: u32,
}
#[derive(PartialEq, Debug, Pread)]
#[repr(C)]
pub struct DirectoryEntry {
pub id: u32,
pub data: u32,
}
impl DirectoryEntry {
pub fn name_offset(&self) -> u32 {
self.id & 0x7fffffff
}
pub fn name_is_string(&self) -> bool {
(self.id & 0x80000000) != 0
}
pub fn offset_to_directory(&self) -> u32 {
self.data & 0x7fffffff
}
pub fn data_is_directory(&self) -> bool {
(self.data & 0x80000000) != 0
}
}