polkavm_common/
elf.rs

1pub struct Reader<'a> {
2    pub buffer: &'a [u8],
3    pub bytes_consumed: usize,
4}
5
6impl<'a> Reader<'a> {
7    pub fn read(&mut self, length: usize) -> Result<&'a [u8], &'static str> {
8        let subslice = self.buffer.get(..length).ok_or("unexpected end of section")?;
9        self.buffer = &self.buffer[length..];
10        self.bytes_consumed += length;
11        Ok(subslice)
12    }
13
14    pub fn read_byte(&mut self) -> Result<u8, &'static str> {
15        Ok(self.read(1)?[0])
16    }
17
18    pub fn read_u32(&mut self) -> Result<u32, &'static str> {
19        let v = self.read(4)?;
20        Ok(u32::from_le_bytes([v[0], v[1], v[2], v[3]]))
21    }
22
23    pub fn read_u64(&mut self) -> Result<u64, &'static str> {
24        let v = self.read(8)?;
25        Ok(u64::from_le_bytes([v[0], v[1], v[2], v[3], v[4], v[5], v[6], v[7]]))
26    }
27
28    pub fn offset(&self) -> usize {
29        self.bytes_consumed
30    }
31
32    pub fn is_empty(&self) -> bool {
33        self.bytes_consumed >= self.buffer.len()
34    }
35}
36
37impl<'a> From<&'a [u8]> for Reader<'a> {
38    fn from(buffer: &'a [u8]) -> Self {
39        Reader { buffer, bytes_consumed: 0 }
40    }
41}