aboutsummaryrefslogtreecommitdiff
path: root/src/helper.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/helper.rs')
-rw-r--r--src/helper.rs76
1 files changed, 76 insertions, 0 deletions
diff --git a/src/helper.rs b/src/helper.rs
index 79c2872..c2b9a92 100644
--- a/src/helper.rs
+++ b/src/helper.rs
@@ -1,28 +1,104 @@
use std::io::{Read, Result};
+#[derive(Debug, Clone, Copy, PartialEq)]
+pub enum Endianness {
+ Big,
+ Little,
+}
+
pub trait ReadExt {
+ fn read_u8(&mut self) -> Result<u8>;
fn read_u16_be(&mut self) -> Result<u16>;
+ fn read_i16(&mut self, e: Endianness) -> Result<i16>;
+ fn read_i16_be(&mut self) -> Result<i16>;
+ fn read_i16_le(&mut self) -> Result<i16>;
+ fn read_i32(&mut self, e: Endianness) -> Result<i32>;
+ fn read_i32_be(&mut self) -> Result<i32>;
+ fn read_i32_le(&mut self) -> Result<i32>;
+ fn read_u32(&mut self, e: Endianness) -> Result<u32>;
fn read_u32_be(&mut self) -> Result<u32>;
+ fn read_u32_le(&mut self) -> Result<u32>;
+ fn read_u64(&mut self, e: Endianness) -> Result<u64>;
fn read_u64_be(&mut self) -> Result<u64>;
+ fn read_u64_le(&mut self) -> Result<u64>;
fn read_u128_be(&mut self) -> Result<u128>;
fn read_cstr(&mut self) -> Result<String>;
}
impl<T: Read> ReadExt for T {
+ fn read_u8(&mut self) -> Result<u8> {
+ let mut buf = [0; 2];
+ self.read_exact(&mut buf)?;
+ Ok(buf[0])
+ }
fn read_u16_be(&mut self) -> Result<u16> {
let mut buf = [0; 2];
self.read_exact(&mut buf)?;
Ok(u16::from_be_bytes(buf))
}
+ fn read_i16(&mut self, e: Endianness) -> Result<i16> {
+ match e {
+ Endianness::Big => self.read_i16_be(),
+ Endianness::Little => self.read_i16_le(),
+ }
+ }
+ fn read_i16_be(&mut self) -> Result<i16> {
+ let mut buf = [0; 2];
+ self.read_exact(&mut buf)?;
+ Ok(i16::from_be_bytes(buf))
+ }
+ fn read_i16_le(&mut self) -> Result<i16> {
+ let mut buf = [0; 2];
+ self.read_exact(&mut buf)?;
+ Ok(i16::from_le_bytes(buf))
+ }
+ fn read_i32(&mut self, e: Endianness) -> Result<i32> {
+ match e {
+ Endianness::Big => self.read_i32_be(),
+ Endianness::Little => self.read_i32_le(),
+ }
+ }
+ fn read_i32_be(&mut self) -> Result<i32> {
+ let mut buf = [0; 4];
+ self.read_exact(&mut buf)?;
+ Ok(i32::from_be_bytes(buf))
+ }
+ fn read_i32_le(&mut self) -> Result<i32> {
+ let mut buf = [0; 4];
+ self.read_exact(&mut buf)?;
+ Ok(i32::from_le_bytes(buf))
+ }
+ fn read_u32(&mut self, e: Endianness) -> Result<u32> {
+ match e {
+ Endianness::Big => self.read_u32_be(),
+ Endianness::Little => self.read_u32_le(),
+ }
+ }
fn read_u32_be(&mut self) -> Result<u32> {
let mut buf = [0; 4];
self.read_exact(&mut buf)?;
Ok(u32::from_be_bytes(buf))
}
+ fn read_u32_le(&mut self) -> Result<u32> {
+ let mut buf = [0; 4];
+ self.read_exact(&mut buf)?;
+ Ok(u32::from_le_bytes(buf))
+ }
+ fn read_u64(&mut self, e: Endianness) -> Result<u64> {
+ match e {
+ Endianness::Big => self.read_u64_be(),
+ Endianness::Little => self.read_u64_le(),
+ }
+ }
fn read_u64_be(&mut self) -> Result<u64> {
let mut buf = [0; 8];
self.read_exact(&mut buf)?;
Ok(u64::from_be_bytes(buf))
}
+ fn read_u64_le(&mut self) -> Result<u64> {
+ let mut buf = [0; 8];
+ self.read_exact(&mut buf)?;
+ Ok(u64::from_le_bytes(buf))
+ }
fn read_u128_be(&mut self) -> Result<u128> {
let mut buf = [0; 16];
self.read_exact(&mut buf)?;