xref: /DragonOS/kernel/src/libs/vec_cursor.rs (revision 676b8ef62e1a0a1e52d65b40c53c1636a2954040)
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