1004e86ffSlogin #![allow(dead_code)] 2004e86ffSlogin 3004e86ffSlogin use core::mem::size_of; 4004e86ffSlogin 5004e86ffSlogin use alloc::vec::Vec; 6*91e9d4abSLoGin use system_error::SystemError; 7004e86ffSlogin 8*91e9d4abSLoGin use crate::driver::base::block::SeekFrom; 9004e86ffSlogin 10004e86ffSlogin /// @brief 本模块用于为数组提供游标的功能,以简化其操作。 11004e86ffSlogin #[derive(Debug)] 12004e86ffSlogin pub struct VecCursor { 13004e86ffSlogin /// 游标管理的数据 14004e86ffSlogin data: Vec<u8>, 15004e86ffSlogin /// 游标的位置 16004e86ffSlogin pos: usize, 17004e86ffSlogin } 18004e86ffSlogin 19004e86ffSlogin impl VecCursor { 20004e86ffSlogin /// @brief 新建一个游标 21004e86ffSlogin pub fn new(data: Vec<u8>) -> Self { 22004e86ffSlogin return Self { data: data, pos: 0 }; 23004e86ffSlogin } 24004e86ffSlogin 25004e86ffSlogin /// @brief 创建一个全0的cursor 26004e86ffSlogin pub fn zerod(length: usize) -> Self { 27004e86ffSlogin let mut result = VecCursor { 28004e86ffSlogin data: Vec::new(), 29004e86ffSlogin pos: 0, 30004e86ffSlogin }; 31004e86ffSlogin result.data.resize(length, 0); 32004e86ffSlogin return result; 33004e86ffSlogin } 34004e86ffSlogin 35004e86ffSlogin /// @brief 获取游标管理的数据的可变引用 36004e86ffSlogin pub fn get_mut(&mut self) -> &mut Vec<u8> { 37004e86ffSlogin return &mut self.data; 38004e86ffSlogin } 39004e86ffSlogin 40004e86ffSlogin /// @brief 获取游标管理的数据的不可变引用 41004e86ffSlogin pub fn get_ref(&self) -> &Vec<u8> { 42004e86ffSlogin return &self.data; 43004e86ffSlogin } 44004e86ffSlogin 45004e86ffSlogin /// @brief 读取一个u8的数据(小端对齐) 46676b8ef6SMork pub fn read_u8(&mut self) -> Result<u8, SystemError> { 47004e86ffSlogin if self.pos >= self.data.len() { 48676b8ef6SMork return Err(SystemError::E2BIG); 49004e86ffSlogin } 50004e86ffSlogin self.pos += 1; 51004e86ffSlogin return Ok(self.data[self.pos - 1]); 52004e86ffSlogin } 53004e86ffSlogin 54004e86ffSlogin /// @brief 读取一个u16的数据(小端对齐) 55676b8ef6SMork pub fn read_u16(&mut self) -> Result<u16, SystemError> { 56004e86ffSlogin if self.pos + 2 > self.data.len() { 57676b8ef6SMork return Err(SystemError::E2BIG); 58004e86ffSlogin } 59004e86ffSlogin let mut res = 0u16; 60004e86ffSlogin res |= (self.data[self.pos] as u16) & 0xff; 61004e86ffSlogin self.pos += 1; 62004e86ffSlogin res |= ((self.data[self.pos] as u16) & 0xff) << 8; 63004e86ffSlogin self.pos += 1; 64004e86ffSlogin 65004e86ffSlogin return Ok(res); 66004e86ffSlogin } 67004e86ffSlogin 68004e86ffSlogin /// @brief 读取一个u32的数据(小端对齐) 69676b8ef6SMork pub fn read_u32(&mut self) -> Result<u32, SystemError> { 70004e86ffSlogin if self.pos + 4 > self.data.len() { 71676b8ef6SMork return Err(SystemError::E2BIG); 72004e86ffSlogin } 73004e86ffSlogin let mut res = 0u32; 74004e86ffSlogin for i in 0..4 { 75004e86ffSlogin res |= ((self.data[self.pos] as u32) & 0xff) << (8 * i); 76004e86ffSlogin self.pos += 1; 77004e86ffSlogin } 78004e86ffSlogin 79004e86ffSlogin return Ok(res); 80004e86ffSlogin } 81004e86ffSlogin 82004e86ffSlogin /// @brief 读取一个u64的数据(小端对齐) 83676b8ef6SMork pub fn read_u64(&mut self) -> Result<u64, SystemError> { 84004e86ffSlogin if self.pos + 8 > self.data.len() { 85676b8ef6SMork return Err(SystemError::E2BIG); 86004e86ffSlogin } 87004e86ffSlogin let mut res = 0u64; 88004e86ffSlogin for i in 0..8 { 89004e86ffSlogin res |= ((self.data[self.pos] as u64) & 0xff) << (8 * i); 90004e86ffSlogin self.pos += 1; 91004e86ffSlogin } 92004e86ffSlogin 93004e86ffSlogin return Ok(res); 94004e86ffSlogin } 95004e86ffSlogin 96004e86ffSlogin /// @brief 精确读取与buf同样大小的数据。 97004e86ffSlogin /// 98004e86ffSlogin /// @param buf 要读取到的目标缓冲区 99004e86ffSlogin /// 100004e86ffSlogin /// @return Ok(()) 成功读取 101004e86ffSlogin /// @retunr Err(-E2BIG) 没有这么多数据,读取失败 102676b8ef6SMork pub fn read_exact(&mut self, buf: &mut [u8]) -> Result<(), SystemError> { 103004e86ffSlogin if self.pos + buf.len() > self.data.len() { 104676b8ef6SMork return Err(SystemError::E2BIG); 105004e86ffSlogin } 106004e86ffSlogin buf.copy_from_slice(&self.data[self.pos..self.pos + buf.len()]); 107004e86ffSlogin self.pos += buf.len(); 108004e86ffSlogin return Ok(()); 109004e86ffSlogin } 110004e86ffSlogin 111004e86ffSlogin /// @brief 小端对齐,读取数据到u16数组. 112004e86ffSlogin /// 113004e86ffSlogin /// @param buf 目标u16数组 114676b8ef6SMork pub fn read_u16_into(&mut self, buf: &mut [u16]) -> Result<(), SystemError> { 115004e86ffSlogin if self.pos + buf.len() * size_of::<u16>() > self.data.len() * size_of::<u16>() { 116676b8ef6SMork return Err(SystemError::E2BIG); 117004e86ffSlogin } 118004e86ffSlogin 119004e86ffSlogin for i in 0..buf.len() { 120004e86ffSlogin buf[i] = self.read_u16()?; 121004e86ffSlogin } 122004e86ffSlogin 123004e86ffSlogin return Ok(()); 124004e86ffSlogin } 125004e86ffSlogin 126004e86ffSlogin /// @brief 调整游标的位置 127004e86ffSlogin /// 128004e86ffSlogin /// @param 调整的相对值 129004e86ffSlogin /// 130004e86ffSlogin /// @return Ok(新的游标位置) 调整成功,返回新的游标位置 131676b8ef6SMork /// @return Err(SystemError::EOVERFLOW) 调整失败,游标超出正确的范围。(失败时游标位置不变) 132676b8ef6SMork pub fn seek(&mut self, origin: SeekFrom) -> Result<usize, SystemError> { 133004e86ffSlogin let pos: i64; 134004e86ffSlogin match origin { 135004e86ffSlogin SeekFrom::SeekSet(offset) => { 136004e86ffSlogin pos = offset; 137004e86ffSlogin } 138004e86ffSlogin SeekFrom::SeekCurrent(offset) => { 139004e86ffSlogin pos = self.pos as i64 + offset; 140004e86ffSlogin } 141004e86ffSlogin SeekFrom::SeekEnd(offset) => { 142004e86ffSlogin // 请注意,此处的offset应小于等于0,否则肯定是不合法的 143004e86ffSlogin pos = self.data.len() as i64 + offset; 144004e86ffSlogin } 145004e86ffSlogin SeekFrom::Invalid => { 146676b8ef6SMork return Err(SystemError::EINVAL); 147004e86ffSlogin } 148004e86ffSlogin } 149004e86ffSlogin 150004e86ffSlogin if pos < 0 || pos > self.data.len() as i64 { 151676b8ef6SMork return Err(SystemError::EOVERFLOW); 152004e86ffSlogin } 153004e86ffSlogin self.pos = pos as usize; 154004e86ffSlogin return Ok(self.pos); 155004e86ffSlogin } 156004e86ffSlogin 157004e86ffSlogin /// @brief 写入一个u8的数据(小端对齐) 158676b8ef6SMork pub fn write_u8(&mut self, value: u8) -> Result<u8, SystemError> { 159004e86ffSlogin if self.pos >= self.data.len() { 160676b8ef6SMork return Err(SystemError::E2BIG); 161004e86ffSlogin } 162004e86ffSlogin 163004e86ffSlogin self.data[self.pos] = value; 164004e86ffSlogin self.pos += 1; 165004e86ffSlogin 166004e86ffSlogin return Ok(value); 167004e86ffSlogin } 168004e86ffSlogin 169004e86ffSlogin /// @brief 写入一个u16的数据(小端对齐) 170676b8ef6SMork pub fn write_u16(&mut self, value: u16) -> Result<u16, SystemError> { 171004e86ffSlogin if self.pos + 2 > self.data.len() { 172676b8ef6SMork return Err(SystemError::E2BIG); 173004e86ffSlogin } 174004e86ffSlogin 175004e86ffSlogin self.data[self.pos] = (value & 0xff) as u8; 176004e86ffSlogin self.pos += 1; 177004e86ffSlogin self.data[self.pos] = ((value >> 8) & 0xff) as u8; 178004e86ffSlogin self.pos += 1; 179004e86ffSlogin 180004e86ffSlogin return Ok(value); 181004e86ffSlogin } 182004e86ffSlogin 183004e86ffSlogin /// @brief 写入一个u32的数据(小端对齐) 184676b8ef6SMork pub fn write_u32(&mut self, value: u32) -> Result<u32, SystemError> { 185004e86ffSlogin if self.pos + 4 > self.data.len() { 186676b8ef6SMork return Err(SystemError::E2BIG); 187004e86ffSlogin } 188004e86ffSlogin 189004e86ffSlogin for i in 0..4 { 190004e86ffSlogin self.data[self.pos] = ((value >> (i * 8)) & 0xff) as u8; 191004e86ffSlogin self.pos += 1; 192004e86ffSlogin } 193004e86ffSlogin 194004e86ffSlogin return Ok(value); 195004e86ffSlogin } 196004e86ffSlogin 197004e86ffSlogin /// @brief 写入一个u64的数据(小端对齐) 198676b8ef6SMork pub fn write_u64(&mut self, value: u64) -> Result<u64, SystemError> { 199004e86ffSlogin if self.pos + 8 > self.data.len() { 200676b8ef6SMork return Err(SystemError::E2BIG); 201004e86ffSlogin } 202004e86ffSlogin 203004e86ffSlogin for i in 0..8 { 204004e86ffSlogin self.data[self.pos] = ((value >> (i * 8)) & 0xff) as u8; 205004e86ffSlogin self.pos += 1; 206004e86ffSlogin } 207004e86ffSlogin 208004e86ffSlogin return Ok(value); 209004e86ffSlogin } 210004e86ffSlogin 211004e86ffSlogin /// @brief 精确写入与buf同样大小的数据。 212004e86ffSlogin /// 213004e86ffSlogin /// @param buf 要写入到的目标缓冲区 214004e86ffSlogin /// 215004e86ffSlogin /// @return Ok(()) 成功写入 216004e86ffSlogin /// @retunr Err(-E2BIG) 没有这么多数据,写入失败 217676b8ef6SMork pub fn write_exact(&mut self, buf: &[u8]) -> Result<(), SystemError> { 218004e86ffSlogin if self.pos + buf.len() > self.data.len() { 219676b8ef6SMork return Err(SystemError::E2BIG); 220004e86ffSlogin } 221004e86ffSlogin 222004e86ffSlogin self.data[self.pos..self.pos + buf.len()].copy_from_slice(&buf[..]); 223004e86ffSlogin self.pos += buf.len(); 224004e86ffSlogin 225004e86ffSlogin return Ok(()); 226004e86ffSlogin } 227004e86ffSlogin 228004e86ffSlogin /// @brief 获取当前的数据切片 229004e86ffSlogin pub fn as_slice(&self) -> &[u8] { 230004e86ffSlogin return &self.data[..]; 231004e86ffSlogin } 232004e86ffSlogin 233004e86ffSlogin /// @brief 获取可变数据切片 234004e86ffSlogin pub fn as_mut_slice(&mut self) -> &mut [u8] { 235004e86ffSlogin return &mut self.data[..]; 236004e86ffSlogin } 237004e86ffSlogin 238004e86ffSlogin /// @brief 获取当前游标的位置 239004e86ffSlogin #[inline] 240004e86ffSlogin pub fn pos(&self) -> usize { 241004e86ffSlogin return self.pos; 242004e86ffSlogin } 243004e86ffSlogin 244004e86ffSlogin /// @brief 获取缓冲区数据的大小 245004e86ffSlogin #[inline] 246004e86ffSlogin pub fn len(&self) -> usize { 247004e86ffSlogin return self.data.len(); 248004e86ffSlogin } 249004e86ffSlogin } 250