1004e86ffSlogin #![allow(dead_code)] 2004e86ffSlogin 3*b5b571e0SLoGin use core::mem::{size_of, size_of_val}; 4004e86ffSlogin 5004e86ffSlogin use alloc::vec::Vec; 691e9d4abSLoGin use system_error::SystemError; 7004e86ffSlogin 891e9d4abSLoGin 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 新建一个游标 new(data: Vec<u8>) -> Self21004e86ffSlogin pub fn new(data: Vec<u8>) -> Self { 22*b5b571e0SLoGin return Self { data, pos: 0 }; 23004e86ffSlogin } 24004e86ffSlogin 25004e86ffSlogin /// @brief 创建一个全0的cursor zerod(length: usize) -> Self26004e86ffSlogin 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 获取游标管理的数据的可变引用 get_mut(&mut self) -> &mut Vec<u8>36004e86ffSlogin pub fn get_mut(&mut self) -> &mut Vec<u8> { 37004e86ffSlogin return &mut self.data; 38004e86ffSlogin } 39004e86ffSlogin 40004e86ffSlogin /// @brief 获取游标管理的数据的不可变引用 get_ref(&self) -> &Vec<u8>41004e86ffSlogin pub fn get_ref(&self) -> &Vec<u8> { 42004e86ffSlogin return &self.data; 43004e86ffSlogin } 44004e86ffSlogin 45004e86ffSlogin /// @brief 读取一个u8的数据(小端对齐) read_u8(&mut self) -> Result<u8, SystemError>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的数据(小端对齐) read_u16(&mut self) -> Result<u16, SystemError>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的数据(小端对齐) read_u32(&mut self) -> Result<u32, SystemError>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的数据(小端对齐) read_u64(&mut self) -> Result<u64, SystemError>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) 没有这么多数据,读取失败 read_exact(&mut self, buf: &mut [u8]) -> Result<(), SystemError>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数组 read_u16_into(&mut self, buf: &mut [u16]) -> Result<(), SystemError>114676b8ef6SMork pub fn read_u16_into(&mut self, buf: &mut [u16]) -> Result<(), SystemError> { 115*b5b571e0SLoGin if self.pos + size_of_val(buf) > self.data.len() * size_of::<u16>() { 116676b8ef6SMork return Err(SystemError::E2BIG); 117004e86ffSlogin } 118004e86ffSlogin 119*b5b571e0SLoGin for item in buf.iter_mut() { 120*b5b571e0SLoGin *item = self.read_u16()?; 121004e86ffSlogin } 122004e86ffSlogin 123004e86ffSlogin return Ok(()); 124004e86ffSlogin } 125004e86ffSlogin 126004e86ffSlogin /// @brief 调整游标的位置 127004e86ffSlogin /// 128004e86ffSlogin /// @param 调整的相对值 129004e86ffSlogin /// 130004e86ffSlogin /// @return Ok(新的游标位置) 调整成功,返回新的游标位置 131676b8ef6SMork /// @return Err(SystemError::EOVERFLOW) 调整失败,游标超出正确的范围。(失败时游标位置不变) seek(&mut self, origin: SeekFrom) -> Result<usize, SystemError>132676b8ef6SMork pub fn seek(&mut self, origin: SeekFrom) -> Result<usize, SystemError> { 133*b5b571e0SLoGin let pos = match origin { 134*b5b571e0SLoGin SeekFrom::SeekSet(offset) => offset, 135*b5b571e0SLoGin SeekFrom::SeekCurrent(offset) => self.pos as i64 + offset, 136004e86ffSlogin // 请注意,此处的offset应小于等于0,否则肯定是不合法的 137*b5b571e0SLoGin SeekFrom::SeekEnd(offset) => self.data.len() as i64 + offset, 138004e86ffSlogin SeekFrom::Invalid => { 139676b8ef6SMork return Err(SystemError::EINVAL); 140004e86ffSlogin } 141*b5b571e0SLoGin }; 142004e86ffSlogin 143004e86ffSlogin if pos < 0 || pos > self.data.len() as i64 { 144676b8ef6SMork return Err(SystemError::EOVERFLOW); 145004e86ffSlogin } 146004e86ffSlogin self.pos = pos as usize; 147004e86ffSlogin return Ok(self.pos); 148004e86ffSlogin } 149004e86ffSlogin 150004e86ffSlogin /// @brief 写入一个u8的数据(小端对齐) write_u8(&mut self, value: u8) -> Result<u8, SystemError>151676b8ef6SMork pub fn write_u8(&mut self, value: u8) -> Result<u8, SystemError> { 152004e86ffSlogin if self.pos >= self.data.len() { 153676b8ef6SMork return Err(SystemError::E2BIG); 154004e86ffSlogin } 155004e86ffSlogin 156004e86ffSlogin self.data[self.pos] = value; 157004e86ffSlogin self.pos += 1; 158004e86ffSlogin 159004e86ffSlogin return Ok(value); 160004e86ffSlogin } 161004e86ffSlogin 162004e86ffSlogin /// @brief 写入一个u16的数据(小端对齐) write_u16(&mut self, value: u16) -> Result<u16, SystemError>163676b8ef6SMork pub fn write_u16(&mut self, value: u16) -> Result<u16, SystemError> { 164004e86ffSlogin if self.pos + 2 > self.data.len() { 165676b8ef6SMork return Err(SystemError::E2BIG); 166004e86ffSlogin } 167004e86ffSlogin 168004e86ffSlogin self.data[self.pos] = (value & 0xff) as u8; 169004e86ffSlogin self.pos += 1; 170004e86ffSlogin self.data[self.pos] = ((value >> 8) & 0xff) as u8; 171004e86ffSlogin self.pos += 1; 172004e86ffSlogin 173004e86ffSlogin return Ok(value); 174004e86ffSlogin } 175004e86ffSlogin 176004e86ffSlogin /// @brief 写入一个u32的数据(小端对齐) write_u32(&mut self, value: u32) -> Result<u32, SystemError>177676b8ef6SMork pub fn write_u32(&mut self, value: u32) -> Result<u32, SystemError> { 178004e86ffSlogin if self.pos + 4 > self.data.len() { 179676b8ef6SMork return Err(SystemError::E2BIG); 180004e86ffSlogin } 181004e86ffSlogin 182004e86ffSlogin for i in 0..4 { 183004e86ffSlogin self.data[self.pos] = ((value >> (i * 8)) & 0xff) as u8; 184004e86ffSlogin self.pos += 1; 185004e86ffSlogin } 186004e86ffSlogin 187004e86ffSlogin return Ok(value); 188004e86ffSlogin } 189004e86ffSlogin 190004e86ffSlogin /// @brief 写入一个u64的数据(小端对齐) write_u64(&mut self, value: u64) -> Result<u64, SystemError>191676b8ef6SMork pub fn write_u64(&mut self, value: u64) -> Result<u64, SystemError> { 192004e86ffSlogin if self.pos + 8 > self.data.len() { 193676b8ef6SMork return Err(SystemError::E2BIG); 194004e86ffSlogin } 195004e86ffSlogin 196004e86ffSlogin for i in 0..8 { 197004e86ffSlogin self.data[self.pos] = ((value >> (i * 8)) & 0xff) as u8; 198004e86ffSlogin self.pos += 1; 199004e86ffSlogin } 200004e86ffSlogin 201004e86ffSlogin return Ok(value); 202004e86ffSlogin } 203004e86ffSlogin 204004e86ffSlogin /// @brief 精确写入与buf同样大小的数据。 205004e86ffSlogin /// 206004e86ffSlogin /// @param buf 要写入到的目标缓冲区 207004e86ffSlogin /// 208004e86ffSlogin /// @return Ok(()) 成功写入 209004e86ffSlogin /// @retunr Err(-E2BIG) 没有这么多数据,写入失败 write_exact(&mut self, buf: &[u8]) -> Result<(), SystemError>210676b8ef6SMork pub fn write_exact(&mut self, buf: &[u8]) -> Result<(), SystemError> { 211004e86ffSlogin if self.pos + buf.len() > self.data.len() { 212676b8ef6SMork return Err(SystemError::E2BIG); 213004e86ffSlogin } 214004e86ffSlogin 215*b5b571e0SLoGin self.data[self.pos..self.pos + buf.len()].copy_from_slice(buf); 216004e86ffSlogin self.pos += buf.len(); 217004e86ffSlogin 218004e86ffSlogin return Ok(()); 219004e86ffSlogin } 220004e86ffSlogin 221004e86ffSlogin /// @brief 获取当前的数据切片 as_slice(&self) -> &[u8]222004e86ffSlogin pub fn as_slice(&self) -> &[u8] { 223004e86ffSlogin return &self.data[..]; 224004e86ffSlogin } 225004e86ffSlogin 226004e86ffSlogin /// @brief 获取可变数据切片 as_mut_slice(&mut self) -> &mut [u8]227004e86ffSlogin pub fn as_mut_slice(&mut self) -> &mut [u8] { 228004e86ffSlogin return &mut self.data[..]; 229004e86ffSlogin } 230004e86ffSlogin 231004e86ffSlogin /// @brief 获取当前游标的位置 232004e86ffSlogin #[inline] pos(&self) -> usize233004e86ffSlogin pub fn pos(&self) -> usize { 234004e86ffSlogin return self.pos; 235004e86ffSlogin } 236004e86ffSlogin 237004e86ffSlogin /// @brief 获取缓冲区数据的大小 238004e86ffSlogin #[inline] len(&self) -> usize239004e86ffSlogin pub fn len(&self) -> usize { 240004e86ffSlogin return self.data.len(); 241004e86ffSlogin } 242004e86ffSlogin } 243