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;