use crate::errors::FileParseError;
use crate::field::{ByteOrder, Field};
pub const GRP_COMDAT: u32 = 1;
pub struct SectionGroup {
pub section_index: usize,
pub flags: Field<u32>,
pub members: Vec<Field<u32>>,
}
impl SectionGroup {
pub fn is_comdat(&self) -> bool {
self.flags.value & GRP_COMDAT != 0
}
pub fn parse(
buffer: &[u8],
offset: usize,
size: usize,
section_index: usize,
order: ByteOrder,
) -> Result<Self, FileParseError> {
if size < 4 {
return Err(FileParseError::BufferOverflow);
}
let end = offset
.checked_add(size)
.ok_or(FileParseError::BufferOverflow)?;
let flags = Field::new(order.read_u32(buffer, offset)?, offset, 4);
let mut cursor = offset + 4;
let mut members = Vec::new();
while cursor + 4 <= end {
members.push(Field::new(order.read_u32(buffer, cursor)?, cursor, 4));
cursor += 4;
}
Ok(Self {
section_index,
flags,
members,
})
}
}