Skip to main content

pipa/regexp/
opcode.rs

1pub const REG_COUNT: usize = 8;
2
3pub const REG_PC: usize = 0;
4pub const REG_POS: usize = 0;
5pub const REG_COUNTER: usize = 1;
6pub const REG_TEMP: usize = 2;
7pub const REG_SAVE0: usize = 3;
8pub const REG_SAVE1: usize = 4;
9pub const REG_SAVE2: usize = 5;
10pub const REG_SAVE3: usize = 6;
11pub const REG_MARK: usize = 7;
12
13#[derive(Debug, Clone, Copy, PartialEq, Eq)]
14#[repr(u8)]
15pub enum OpCode {
16    Invalid = 0,
17
18    MatchChar = 1,
19
20    MatchCharI = 2,
21
22    MatchChar32 = 3,
23
24    MatchChar32I = 4,
25
26    MatchDot = 5,
27
28    MatchAny = 6,
29
30    MatchClass = 7,
31    MatchClassI = 8,
32
33    CheckLineStart = 9,
34
35    CheckLineEnd = 10,
36
37    CheckWordBoundary = 11,
38    CheckWordBoundaryI = 12,
39    CheckNotWordBoundary = 13,
40    CheckNotWordBoundaryI = 14,
41
42    Jmp = 15,
43
44    JmpMatch = 16,
45
46    JmpFail = 17,
47
48    JmpEq = 18,
49
50    JmpNe = 19,
51
52    JmpLt = 20,
53
54    MovImm = 21,
55
56    MovReg = 22,
57
58    Inc = 23,
59
60    Dec = 24,
61
62    AddImm = 25,
63
64    CmpImm = 26,
65
66    SaveStart = 27,
67
68    SaveEnd = 28,
69
70    ResetCaptures = 29,
71
72    CheckBackref = 30,
73    CheckBackrefI = 31,
74
75    Lookahead = 32,
76
77    NegLookahead = 33,
78
79    PushBacktrack = 34,
80
81    PopBacktrack = 35,
82
83    Mark = 36,
84
85    Restore = 37,
86
87    InitCounter = 38,
88
89    CheckCounter = 39,
90
91    Success = 40,
92
93    Fail = 41,
94
95    Halt = 42,
96}
97
98impl OpCode {
99    pub fn from_u8(v: u8) -> Option<Self> {
100        if v <= 42 {
101            Some(unsafe { std::mem::transmute(v) })
102        } else {
103            None
104        }
105    }
106
107    pub fn size(&self) -> usize {
108        match self {
109            OpCode::Invalid => 1,
110            OpCode::MatchChar => 4,
111            OpCode::MatchCharI => 4,
112            OpCode::MatchChar32 => 6,
113            OpCode::MatchChar32I => 6,
114            OpCode::MatchDot => 1,
115            OpCode::MatchAny => 1,
116            OpCode::MatchClass => 4,
117            OpCode::MatchClassI => 4,
118            OpCode::CheckLineStart => 1,
119            OpCode::CheckLineEnd => 1,
120            OpCode::CheckWordBoundary => 1,
121            OpCode::CheckWordBoundaryI => 1,
122            OpCode::CheckNotWordBoundary => 1,
123            OpCode::CheckNotWordBoundaryI => 1,
124            OpCode::Jmp => 5,
125            OpCode::JmpMatch => 5,
126            OpCode::JmpFail => 5,
127            OpCode::JmpEq => 10,
128            OpCode::JmpNe => 10,
129            OpCode::JmpLt => 10,
130            OpCode::MovImm => 6,
131            OpCode::MovReg => 3,
132            OpCode::Inc => 2,
133            OpCode::Dec => 2,
134            OpCode::AddImm => 6,
135            OpCode::CmpImm => 6,
136            OpCode::SaveStart => 2,
137            OpCode::SaveEnd => 2,
138            OpCode::ResetCaptures => 3,
139            OpCode::CheckBackref => 2,
140            OpCode::CheckBackrefI => 2,
141            OpCode::Lookahead => 5,
142            OpCode::NegLookahead => 5,
143            OpCode::PushBacktrack => 5,
144            OpCode::PopBacktrack => 1,
145            OpCode::Mark => 2,
146            OpCode::Restore => 2,
147            OpCode::InitCounter => 10,
148            OpCode::CheckCounter => 6,
149            OpCode::Success => 1,
150            OpCode::Fail => 1,
151            OpCode::Halt => 1,
152        }
153    }
154}
155
156pub const HEADER_FLAGS: usize = 0;
157pub const HEADER_CAPTURE_COUNT: usize = 2;
158pub const HEADER_REG_COUNT: usize = 3;
159pub const HEADER_CODE_LEN: usize = 4;
160pub const HEADER_LEN: usize = 8;
161
162pub const FLAG_GLOBAL: u16 = 1 << 0;
163pub const FLAG_IGNORE_CASE: u16 = 1 << 1;
164pub const FLAG_MULTI_LINE: u16 = 1 << 2;
165pub const FLAG_DOT_ALL: u16 = 1 << 3;
166pub const FLAG_UNICODE: u16 = 1 << 4;
167pub const FLAG_STICKY: u16 = 1 << 5;
168pub const FLAG_INDICES: u16 = 1 << 6;
169pub const FLAG_NAMED_GROUPS: u16 = 1 << 7;
170pub const FLAG_UNICODE_SETS: u16 = 1 << 8;
171
172pub const MAX_CAPTURES: usize = 255;
173pub const MAX_BACKTRACK: usize = 10000;