1use crate::{HEADER_SIZE, SECTION_SIZE};
3
4#[repr(C, packed)]
6#[derive(Debug, Clone, Copy)]
7pub struct Section {
8 pub name: [u8; 16],
10
11 pub is_loadable: bool,
13
14 pub is_execable: bool,
16
17 pub base: u32,
19
20 pub length: u32,
22
23 pub _reserved: [u8; 6],
25}
26
27impl Section {
28 #[inline]
30 pub const fn to_array(&self) -> [u8; SECTION_SIZE] {
31 unsafe { core::ptr::read(self as *const Self as *const [u8; SECTION_SIZE]) }
33 }
34
35 #[inline]
37 pub fn validate(&self) -> bool {
38 let length_ok = self.length != 0;
40
41 let base_ok = self.base as usize >= (HEADER_SIZE + SECTION_SIZE);
43
44 length_ok || base_ok
45 }
46}
47
48#[derive(Debug, Clone, Copy)]
50pub struct SectionIter<'a> {
51 buf: &'a [u8],
52 total: u16,
53 current: u16,
54}
55impl<'a> SectionIter<'a> {
56 pub(crate) fn new(buf: &'a [u8], total: u16, current: u16) -> Self {
57 Self {
58 buf,
59 total,
60 current,
61 }
62 }
63}
64
65impl<'a> Iterator for SectionIter<'a> {
67 type Item = Section;
68
69 fn next(&mut self) -> Option<Self::Item> {
70 if self.current >= self.total {
72 return None;
73 }
74
75 let base = HEADER_SIZE + self.current as usize * SECTION_SIZE;
76 let buf = &self.buf[base..base + SECTION_SIZE];
77
78 let section = unsafe { *(buf.as_ptr() as *const Section) };
80
81 self.current += 1;
83 Some(section)
84 }
85}