1#[cfg(not(feature = "std"))]
2use alloc::{
3 vec::Vec,
4};
5use crate::{ByteOrder, JResult};
6use crate::errors::{make_error, ErrorKind};
7
8
9pub trait InputTrait<'a> {
10 fn find_subsequence<'b>(&self, needle: &'b [u8], is_save_needle: bool) -> JResult<&'a [u8], &'a [u8]>;
11
12 fn find_subsequences<'b>(&self, needles: &'b [&'b [u8]], is_save_needle: bool) -> JResult<&'a [u8], &'a [u8]>;
13
14 fn find_subsequences2<'b>(&self, needles: &'b Vec<Vec<u8>>, is_save_needle: bool) -> JResult<&'a [u8], &'a [u8]>;
15
16 fn input_take(&self, length: usize) -> JResult<&'a [u8], &'a [u8]>;
17
18 fn to_bits(&self, byteorder: ByteOrder, byte_count: u8) -> JResult<&'a [u8], u128>;
19
20 fn to_le_bits(&self, byte_count: u8) -> JResult<&'a [u8], u128>;
21
22 fn to_be_bits(&self, byte_count: u8) -> JResult<&'a [u8], u128>;
23
24 #[inline]
25 fn to_bits_usize(&self, byteorder: ByteOrder, byte_count: u8) -> JResult<&'a [u8], usize> {
26 let (input, value) = self.to_bits(byteorder, byte_count)?;
27 Ok((input, value as usize))
28 }
29
30 #[inline]
31 fn to_le_bits_usize(&self, byte_count: u8) -> JResult<&'a [u8], usize> {
32 let (input, value) = self.to_le_bits(byte_count)?;
33 Ok((input, value as usize))
34 }
35
36 #[inline]
37 fn to_be_bits_usize(&self, byte_count: u8) -> JResult<&'a [u8], usize> {
38 let (input, value) = self.to_be_bits(byte_count)?;
39 Ok((input, value as usize))
40 }
41}
42
43
44impl<'a> InputTrait<'a> for &'a [u8] {
45 fn find_subsequence<'b>(&self, needle: &'b [u8], is_save_needle: bool) -> JResult<&'a [u8], &'a [u8]> {
47 let input = *self;
48 let needle_len = needle.len();
49 let input_len = input.len();
50
51 if needle_len > input_len {
52 return Err(make_error(input, ErrorKind::InvalidByteLength { offset: input_len }));
53 }
54
55 for i in 0..input_len {
64 let mut status = false;
65
66 for j in 0..needle_len {
67 if needle[j] != input[i + j] {
68 status = true;
69 break;
70 }
71 }
72
73 if !status {
74 return Ok((&input[i + needle_len..], if is_save_needle {&input[..i + needle_len]} else {&input[..i]}));
75 }
76 }
77
78 Err(make_error(input, ErrorKind::InvalidByteLength { offset: 0 }))
79 }
80
81 fn find_subsequences<'b>(&self, needles: &'b [&'b [u8]], is_save_needle: bool) -> JResult<&'a [u8], &'a [u8]> {
82 let input = *self;
83 let input_len = input.len();
84
85 for needle in needles {
86 if let Ok((input, value)) = self.find_subsequence(needle, is_save_needle) {
87 return Ok((input, value));
88 }
89 }
90
91 Err(make_error(input, ErrorKind::SubSequence { offset: input_len }))
92 }
93
94 fn find_subsequences2<'b>(&self, needles: &'b Vec<Vec<u8>>, is_save_needle: bool) -> JResult<&'a [u8], &'a [u8]> {
95 let input = *self;
96 let input_len = input.len();
97
98 for needle in needles {
99 if let Ok((input, value)) = self.find_subsequence(needle, is_save_needle) {
100 return Ok((input, value));
101 }
102 }
103
104 Err(make_error(input, ErrorKind::SubSequence { offset: input_len }))
105 }
106
107 #[inline]
108 fn input_take(&self, length: usize) -> JResult<&'a [u8], &'a [u8]> {
109 let input = *self;
110
111 if length <= input.len() {
112 return Ok((&input[length..], &input[..length]));
113 }
114
115 Err(make_error(input, ErrorKind::InvalidByteLength { offset: input.len() }))
116 }
117
118 fn to_bits(&self, byteorder: ByteOrder, byte_count: u8) -> JResult<&'a [u8], u128> {
119 let input = *self;
120 let input_len = input.len();
121 let mut value: u128 = 0;
122
123 if input_len < byte_count.into() {
124 return Err(make_error(input, ErrorKind::InvalidByteLength { offset: input_len }));
125 }
126
127 match byteorder {
128 ByteOrder::Be => {
129 for byte in input.iter().take(byte_count.into()) {
130 value = (value << 8) + *byte as u128;
131 }
132 },
133 ByteOrder::Le => {
134 for (index, byte) in input.iter().enumerate().take(byte_count.into()) {
135 value += (*byte as u128) << (8 * index);
136 }
137 }
138 }
139
140 Ok((&input[byte_count.into()..], value))
141 }
142
143 #[inline]
144 fn to_be_bits(&self, byte_count: u8) -> JResult<&'a [u8], u128> {
145 self.to_bits(ByteOrder::Be, byte_count)
146 }
147
148 #[inline]
149 fn to_le_bits(&self, byte_count: u8) -> JResult<&'a [u8], u128> {
150 self.to_bits(ByteOrder::Le, byte_count)
151 }
152}
153
154
155#[cfg(test)]
156mod test {
157 use super::*;
158
159 #[test]
160 fn test_input_trait() {
161 let input = &b"\x00\x01\x00\x02"[..];
162 let (input, value) = input.to_be_bits(2).unwrap();
163 assert_eq!(value, 0x0001);
164 assert_eq!(input, b"\x00\x02");
165
166 let (input, value) = input.to_le_bits(2).unwrap();
167 assert_eq!(value, 0x0200);
168 assert_eq!(input.is_empty(), true);
169
170 let input = &b"\x00\x01\x00\x02"[..];
171 let (input, value) = input.input_take(2).unwrap();
172 assert_eq!(value, b"\x00\x01");
173 assert_eq!(input, b"\x00\x02");
174
175 let input = &b"\x00\x01\x00\x02"[..];
176 let (input, value) = input.find_subsequence(b"\x01\x00", false).unwrap();
177 assert_eq!(value, b"\x00");
178 assert_eq!(input, b"\x02");
179
180 let input = &b"\x00\x01\x00\x02"[..];
181 let (input, value) = input.find_subsequence(b"\x01\x00", true).unwrap();
182 assert_eq!(value, b"\x00\x01\x00");
183 assert_eq!(input, b"\x02");
184 }
185}