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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
use re_trait::{RegularExpression, Slot};
#[doc(hidden)]
pub struct Plugin {
#[doc(hidden)]
pub original: &'static str,
#[doc(hidden)]
pub names: &'static &'static [Option<&'static str>],
#[doc(hidden)]
pub groups: &'static &'static [(&'static str, usize)],
#[doc(hidden)]
pub prog: fn(&mut [Slot], &str, usize) -> bool,
}
impl Copy for Plugin {}
impl Clone for Plugin {
fn clone(&self) -> Plugin {
*self
}
}
impl RegularExpression for Plugin {
type Text = str;
fn slots_len(&self) -> usize {
self.names.len() * 2
}
fn next_after_empty(&self, text: &str, i: usize) -> usize {
let b = match text.as_bytes().get(i) {
None => return text.len() + 1,
Some(&b) => b,
};
let inc = if b <= 0x7F {
1
} else if b <= 0b110_11111 {
2
} else if b <= 0b1110_1111 {
3
} else {
4
};
i + inc
}
fn shortest_match_at(&self, text: &str, start: usize) -> Option<usize> {
self.find_at(text, start).map(|(_, e)| e)
}
fn is_match_at(&self, text: &str, start: usize) -> bool {
(self.prog)(&mut [], text, start)
}
fn find_at(&self, text: &str, start: usize) -> Option<(usize, usize)> {
let mut slots = [None, None];
self.read_captures_at(&mut slots, text, start)
}
fn read_captures_at<'t>(
&self,
slots: &mut [Slot],
text: &'t str,
start: usize,
) -> Option<(usize, usize)> {
for slot in slots.iter_mut() {
*slot = None;
}
(self.prog)(slots, text, start);
match (slots[0], slots[1]) {
(Some(s), Some(e)) => Some((s, e)),
_ => None,
}
}
}