1004e86ffSlogin #![allow(dead_code)] 2004e86ffSlogin 3004e86ffSlogin use core::mem::size_of; 4004e86ffSlogin 5004e86ffSlogin use alloc::vec::Vec; 6004e86ffSlogin 7*676b8ef6SMork use crate::{io::SeekFrom, syscall::SystemError}; 8004e86ffSlogin 9004e86ffSlogin /// @brief 本模块用于为数组提供游标的功能,以简化其操作。 10004e86ffSlogin #[derive(Debug)] 11004e86ffSlogin pub struct VecCursor { 12004e86ffSlogin /// 游标管理的数据 13004e86ffSlogin data: Vec<u8>, 14004e86ffSlogin /// 游标的位置 15004e86ffSlogin pos: usize, 16004e86ffSlogin } 17004e86ffSlogin 18004e86ffSlogin impl VecCursor { 19004e86ffSlogin /// @brief 新建一个游标 20004e86ffSlogin pub fn new(data: Vec<u8>) -> Self { 21004e86ffSlogin return Self { data: data, pos: 0 }; 22004e86ffSlogin } 23004e86ffSlogin 24004e86ffSlogin /// @brief 创建一个全0的cursor 25004e86ffSlogin pub fn zerod(length: usize) -> Self { 26004e86ffSlogin let mut result = VecCursor { 27004e86ffSlogin data: Vec::new(), 28004e86ffSlogin pos: 0, 29004e86ffSlogin }; 30004e86ffSlogin result.data.resize(length, 0); 31004e86ffSlogin return result; 32004e86ffSlogin } 33004e86ffSlogin 34004e86ffSlogin /// @brief 获取游标管理的数据的可变引用 35004e86ffSlogin pub fn get_mut(&mut self) -> &mut Vec<u8> { 36004e86ffSlogin return &mut self.data; 37004e86ffSlogin } 38004e86ffSlogin 39004e86ffSlogin /// @brief 获取游标管理的数据的不可变引用 40004e86ffSlogin pub fn get_ref(&self) -> &Vec<u8> { 41004e86ffSlogin return &self.data; 42004e86ffSlogin } 43004e86ffSlogin 44004e86ffSlogin /// @brief 读取一个u8的数据(小端对齐) 45*676b8ef6SMork pub fn read_u8(&mut self) -> Result<u8, SystemError> { 46004e86ffSlogin if self.pos >= self.data.len() { 47*676b8ef6SMork return Err(SystemError::E2BIG); 48004e86ffSlogin } 49004e86ffSlogin self.pos += 1; 50004e86ffSlogin return Ok(self.data[self.pos - 1]); 51004e86ffSlogin } 52004e86ffSlogin 53004e86ffSlogin /// @brief 读取一个u16的数据(小端对齐) 54*676b8ef6SMork pub fn read_u16(&mut self) -> Result<u16, SystemError> { 55004e86ffSlogin if self.pos + 2 > self.data.len() { 56*676b8ef6SMork return Err(SystemError::E2BIG); 57004e86ffSlogin } 58004e86ffSlogin let mut res = 0u16; 59004e86ffSlogin res |= (self.data[self.pos] as u16) & 0xff; 60004e86ffSlogin self.pos += 1; 61004e86ffSlogin res |= ((self.data[self.pos] as u16) & 0xff) << 8; 62004e86ffSlogin self.pos += 1; 63004e86ffSlogin 64004e86ffSlogin return Ok(res); 65004e86ffSlogin } 66004e86ffSlogin 67004e86ffSlogin /// @brief 读取一个u32的数据(小端对齐) 68*676b8ef6SMork pub fn read_u32(&mut self) -> Result<u32, SystemError> { 69004e86ffSlogin if self.pos + 4 > self.data.len() { 70*676b8ef6SMork return Err(SystemError::E2BIG); 71004e86ffSlogin } 72004e86ffSlogin let mut res = 0u32; 73004e86ffSlogin for i in 0..4 { 74004e86ffSlogin res |= ((self.data[self.pos] as u32) & 0xff) << (8 * i); 75004e86ffSlogin self.pos += 1; 76004e86ffSlogin } 77004e86ffSlogin 78004e86ffSlogin return Ok(res); 79004e86ffSlogin } 80004e86ffSlogin 81004e86ffSlogin /// @brief 读取一个u64的数据(小端对齐) 82*676b8ef6SMork pub fn read_u64(&mut self) -> Result<u64, SystemError> { 83004e86ffSlogin if self.pos + 8 > self.data.len() { 84*676b8ef6SMork return Err(SystemError::E2BIG); 85004e86ffSlogin } 86004e86ffSlogin let mut res = 0u64; 87004e86ffSlogin for i in 0..8 { 88004e86ffSlogin res |= ((self.data[self.pos] as u64) & 0xff) << (8 * i); 89004e86ffSlogin self.pos += 1; 90004e86ffSlogin } 91004e86ffSlogin 92004e86ffSlogin return Ok(res); 93004e86ffSlogin } 94004e86ffSlogin 95004e86ffSlogin /// @brief 精确读取与buf同样大小的数据。 96004e86ffSlogin /// 97004e86ffSlogin /// @param buf 要读取到的目标缓冲区 98004e86ffSlogin /// 99004e86ffSlogin /// @return Ok(()) 成功读取 100004e86ffSlogin /// @retunr Err(-E2BIG) 没有这么多数据,读取失败 101*676b8ef6SMork pub fn read_exact(&mut self, buf: &mut [u8]) -> Result<(), SystemError> { 102004e86ffSlogin if self.pos + buf.len() > self.data.len() { 103*676b8ef6SMork return Err(SystemError::E2BIG); 104004e86ffSlogin } 105004e86ffSlogin buf.copy_from_slice(&self.data[self.pos..self.pos + buf.len()]); 106004e86ffSlogin self.pos += buf.len(); 107004e86ffSlogin return Ok(()); 108004e86ffSlogin } 109004e86ffSlogin 110004e86ffSlogin /// @brief 小端对齐,读取数据到u16数组. 111004e86ffSlogin /// 112004e86ffSlogin /// @param buf 目标u16数组 113*676b8ef6SMork pub fn read_u16_into(&mut self, buf: &mut [u16]) -> Result<(), SystemError> { 114004e86ffSlogin if self.pos + buf.len() * size_of::<u16>() > self.data.len() * size_of::<u16>() { 115*676b8ef6SMork return Err(SystemError::E2BIG); 116004e86ffSlogin } 117004e86ffSlogin 118004e86ffSlogin for i in 0..buf.len() { 119004e86ffSlogin buf[i] = self.read_u16()?; 120004e86ffSlogin } 121004e86ffSlogin 122004e86ffSlogin return Ok(()); 123004e86ffSlogin } 124004e86ffSlogin 125004e86ffSlogin /// @brief 调整游标的位置 126004e86ffSlogin /// 127004e86ffSlogin /// @param 调整的相对值 128004e86ffSlogin /// 129004e86ffSlogin /// @return Ok(新的游标位置) 调整成功,返回新的游标位置 130*676b8ef6SMork /// @return Err(SystemError::EOVERFLOW) 调整失败,游标超出正确的范围。(失败时游标位置不变) 131*676b8ef6SMork pub fn seek(&mut self, origin: SeekFrom) -> Result<usize, SystemError> { 132004e86ffSlogin let pos: i64; 133004e86ffSlogin match origin { 134004e86ffSlogin SeekFrom::SeekSet(offset) => { 135004e86ffSlogin pos = offset; 136004e86ffSlogin } 137004e86ffSlogin SeekFrom::SeekCurrent(offset) => { 138004e86ffSlogin pos = self.pos as i64 + offset; 139004e86ffSlogin } 140004e86ffSlogin SeekFrom::SeekEnd(offset) => { 141004e86ffSlogin // 请注意,此处的offset应小于等于0,否则肯定是不合法的 142004e86ffSlogin pos = self.data.len() as i64 + offset; 143004e86ffSlogin } 144004e86ffSlogin SeekFrom::Invalid => { 145*676b8ef6SMork return Err(SystemError::EINVAL); 146004e86ffSlogin } 147004e86ffSlogin } 148004e86ffSlogin 149004e86ffSlogin if pos < 0 || pos > self.data.len() as i64 { 150*676b8ef6SMork return Err(SystemError::EOVERFLOW); 151004e86ffSlogin } 152004e86ffSlogin self.pos = pos as usize; 153004e86ffSlogin return Ok(self.pos); 154004e86ffSlogin } 155004e86ffSlogin 156004e86ffSlogin /// @brief 写入一个u8的数据(小端对齐) 157*676b8ef6SMork pub fn write_u8(&mut self, value: u8) -> Result<u8, SystemError> { 158004e86ffSlogin if self.pos >= self.data.len() { 159*676b8ef6SMork return Err(SystemError::E2BIG); 160004e86ffSlogin } 161004e86ffSlogin 162004e86ffSlogin self.data[self.pos] = value; 163004e86ffSlogin self.pos += 1; 164004e86ffSlogin 165004e86ffSlogin return Ok(value); 166004e86ffSlogin } 167004e86ffSlogin 168004e86ffSlogin /// @brief 写入一个u16的数据(小端对齐) 169*676b8ef6SMork pub fn write_u16(&mut self, value: u16) -> Result<u16, SystemError> { 170004e86ffSlogin if self.pos + 2 > self.data.len() { 171*676b8ef6SMork return Err(SystemError::E2BIG); 172004e86ffSlogin } 173004e86ffSlogin 174004e86ffSlogin self.data[self.pos] = (value & 0xff) as u8; 175004e86ffSlogin self.pos += 1; 176004e86ffSlogin self.data[self.pos] = ((value >> 8) & 0xff) as u8; 177004e86ffSlogin self.pos += 1; 178004e86ffSlogin 179004e86ffSlogin return Ok(value); 180004e86ffSlogin } 181004e86ffSlogin 182004e86ffSlogin /// @brief 写入一个u32的数据(小端对齐) 183*676b8ef6SMork pub fn write_u32(&mut self, value: u32) -> Result<u32, SystemError> { 184004e86ffSlogin if self.pos + 4 > self.data.len() { 185*676b8ef6SMork return Err(SystemError::E2BIG); 186004e86ffSlogin } 187004e86ffSlogin 188004e86ffSlogin for i in 0..4 { 189004e86ffSlogin self.data[self.pos] = ((value >> (i * 8)) & 0xff) as u8; 190004e86ffSlogin self.pos += 1; 191004e86ffSlogin } 192004e86ffSlogin 193004e86ffSlogin return Ok(value); 194004e86ffSlogin } 195004e86ffSlogin 196004e86ffSlogin /// @brief 写入一个u64的数据(小端对齐) 197*676b8ef6SMork pub fn write_u64(&mut self, value: u64) -> Result<u64, SystemError> { 198004e86ffSlogin if self.pos + 8 > self.data.len() { 199*676b8ef6SMork return Err(SystemError::E2BIG); 200004e86ffSlogin } 201004e86ffSlogin 202004e86ffSlogin for i in 0..8 { 203004e86ffSlogin self.data[self.pos] = ((value >> (i * 8)) & 0xff) as u8; 204004e86ffSlogin self.pos += 1; 205004e86ffSlogin } 206004e86ffSlogin 207004e86ffSlogin return Ok(value); 208004e86ffSlogin } 209004e86ffSlogin 210004e86ffSlogin /// @brief 精确写入与buf同样大小的数据。 211004e86ffSlogin /// 212004e86ffSlogin /// @param buf 要写入到的目标缓冲区 213004e86ffSlogin /// 214004e86ffSlogin /// @return Ok(()) 成功写入 215004e86ffSlogin /// @retunr Err(-E2BIG) 没有这么多数据,写入失败 216*676b8ef6SMork pub fn write_exact(&mut self, buf: &[u8]) -> Result<(), SystemError> { 217004e86ffSlogin if self.pos + buf.len() > self.data.len() { 218*676b8ef6SMork return Err(SystemError::E2BIG); 219004e86ffSlogin } 220004e86ffSlogin 221004e86ffSlogin self.data[self.pos..self.pos + buf.len()].copy_from_slice(&buf[..]); 222004e86ffSlogin self.pos += buf.len(); 223004e86ffSlogin 224004e86ffSlogin return Ok(()); 225004e86ffSlogin } 226004e86ffSlogin 227004e86ffSlogin /// @brief 获取当前的数据切片 228004e86ffSlogin pub fn as_slice(&self) -> &[u8] { 229004e86ffSlogin return &self.data[..]; 230004e86ffSlogin } 231004e86ffSlogin 232004e86ffSlogin /// @brief 获取可变数据切片 233004e86ffSlogin pub fn as_mut_slice(&mut self) -> &mut [u8] { 234004e86ffSlogin return &mut self.data[..]; 235004e86ffSlogin } 236004e86ffSlogin 237004e86ffSlogin /// @brief 获取当前游标的位置 238004e86ffSlogin #[inline] 239004e86ffSlogin pub fn pos(&self) -> usize { 240004e86ffSlogin return self.pos; 241004e86ffSlogin } 242004e86ffSlogin 243004e86ffSlogin /// @brief 获取缓冲区数据的大小 244004e86ffSlogin #[inline] 245004e86ffSlogin pub fn len(&self) -> usize { 246004e86ffSlogin return self.data.len(); 247004e86ffSlogin } 248004e86ffSlogin } 249