| 1 | use crate::common::{Encoding, Format}; |
| 2 | use crate::read::{Error, Reader, Result}; |
| 3 | |
| 4 | #[derive (Debug, Clone, Copy)] |
| 5 | pub(crate) struct ListsHeader { |
| 6 | encoding: Encoding, |
| 7 | #[allow (dead_code)] |
| 8 | offset_entry_count: u32, |
| 9 | } |
| 10 | |
| 11 | impl Default for ListsHeader { |
| 12 | fn default() -> Self { |
| 13 | ListsHeader { |
| 14 | encoding: Encoding { |
| 15 | format: Format::Dwarf32, |
| 16 | version: 5, |
| 17 | address_size: 0, |
| 18 | }, |
| 19 | offset_entry_count: 0, |
| 20 | } |
| 21 | } |
| 22 | } |
| 23 | |
| 24 | impl ListsHeader { |
| 25 | /// Return the serialized size of the table header. |
| 26 | #[allow (dead_code)] |
| 27 | #[inline ] |
| 28 | fn size(self) -> u8 { |
| 29 | // initial_length + version + address_size + segment_selector_size + offset_entry_count |
| 30 | ListsHeader::size_for_encoding(self.encoding) |
| 31 | } |
| 32 | |
| 33 | /// Return the serialized size of the table header. |
| 34 | #[inline ] |
| 35 | pub(crate) fn size_for_encoding(encoding: Encoding) -> u8 { |
| 36 | // initial_length + version + address_size + segment_selector_size + offset_entry_count |
| 37 | encoding.format.initial_length_size() + 2 + 1 + 1 + 4 |
| 38 | } |
| 39 | } |
| 40 | |
| 41 | // TODO: add an iterator over headers in the appropriate sections section |
| 42 | #[allow (dead_code)] |
| 43 | fn parse_header<R: Reader>(input: &mut R) -> Result<ListsHeader> { |
| 44 | let (length, format) = input.read_initial_length()?; |
| 45 | input.truncate(length)?; |
| 46 | |
| 47 | let version = input.read_u16()?; |
| 48 | if version != 5 { |
| 49 | return Err(Error::UnknownVersion(u64::from(version))); |
| 50 | } |
| 51 | |
| 52 | let address_size = input.read_u8()?; |
| 53 | let segment_selector_size = input.read_u8()?; |
| 54 | if segment_selector_size != 0 { |
| 55 | return Err(Error::UnsupportedSegmentSize); |
| 56 | } |
| 57 | let offset_entry_count = input.read_u32()?; |
| 58 | |
| 59 | let encoding = Encoding { |
| 60 | format, |
| 61 | version, |
| 62 | address_size, |
| 63 | }; |
| 64 | Ok(ListsHeader { |
| 65 | encoding, |
| 66 | offset_entry_count, |
| 67 | }) |
| 68 | } |
| 69 | |