1pub fn splitn<D: AsRef<[u8]>>(n: usize, data: &D, seperator: impl AsRef<[u8]>) -> Vec<&[u8]> {
5 let sep = seperator.as_ref();
7 let mut data = data.as_ref();
8
9 let mut buf = Vec::with_capacity(n);
11 while let Some(pos) = scan(data, sep) {
12 if buf.len() + 1 == n {
14 break;
15 }
16
17 let (split, rest) = data.split_at(pos);
19 buf.push(split);
20
21 data = rest.split_at(sep.len()).1;
23 }
24
25 buf.push(data);
27 buf
28}
29
30pub fn split<D: AsRef<[u8]>>(data: &D, seperator: impl AsRef<[u8]>) -> Vec<&[u8]> {
32 let sep = seperator.as_ref();
34 let mut data = data.as_ref();
35
36 let mut buf = Vec::new();
38 while let Some(pos) = scan(data, sep) {
39 let (split, rest) = data.split_at(pos);
41 buf.push(split);
42
43 data = rest.split_at(sep.len()).1;
45 }
46
47 buf.push(data);
49 buf
50}
51
52pub fn scan(data: impl AsRef<[u8]>, pattern: impl AsRef<[u8]>) -> Option<usize> {
54 let data: &[u8] = data.as_ref();
56 let pat: &[u8] = pattern.as_ref();
57
58 if pat.len() > data.len() {
60 return None;
61 }
62
63 let mut found = 0usize;
65 for (i, &d) in data.iter().enumerate() {
66 if d == pat[found] {
68 found += 1;
70
71 if found == pat.len() {
73 return Some(i + 1 - pat.len());
75 }
76 } else {
77 found = 0;
79 }
80 }
81
82 None
84}