1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
/// Slice helper functions
pub fn is_zero(s: &[u8]) -> bool {
for b in s {
if *b != 0 { return false }
}
true
}
pub fn strip_ref_symbols(v: &[u8]) -> &[u8] {
// 38 = &, 42 = *
let mut rv = v;
while rv[0] == 38 || rv[0] == 42 {
rv = &rv[1..];
}
rv
}
pub fn contains_sequence(v: &[u8], seq: &[u8]) -> bool {
if seq.len() > v.len() {
return false
}
let mut seq_i = 0;
for byte in v {
if *byte == seq[seq_i] {
seq_i += 1;
} else {
// Check if current non-equal byte instead equals the first seq byte, then we from there
// To avoid a bug where it fails to find some sequences, eg,
// v seq
// 100 100
// 100 111 Fail, start over
// 111 100 Fail
if *byte == seq[0] {
seq_i = 1;
} else {
seq_i = 0;
}
}
if seq_i == seq.len() {
return true
}
}
false
}