Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
RegexWriter.cs
Go to the documentation of this file.
4
6
7internal ref struct RegexWriter
8{
10
12
14
16
17 private int _trackCount;
18
27
29 {
33 RegexCode result = regexWriter.RegexCodeFromRegexTree(tree);
34 regexWriter.Dispose();
35 return result;
36 }
37
38 public void Dispose()
39 {
40 _emitted.Dispose();
41 _intStack.Dispose();
42 }
43
45 {
46 int capsize;
47 if (tree.CapNumList == null || tree.CapTop == tree.CapNumList.Length)
48 {
49 capsize = tree.CapTop;
50 _caps = null;
51 }
52 else
53 {
54 capsize = tree.CapNumList.Length;
55 _caps = tree.Caps;
56 for (int i = 0; i < tree.CapNumList.Length; i++)
57 {
58 _caps[tree.CapNumList[i]] = i;
59 }
60 }
61 Emit(23, 0);
63 int num = 0;
64 while (true)
65 {
66 int num2 = regexNode.ChildCount();
67 if (num2 == 0)
68 {
70 }
71 else if (num < num2)
72 {
73 EmitFragment(regexNode.Type | 0x40, regexNode, num);
74 regexNode = regexNode.Child(num);
75 _intStack.Append(num);
76 num = 0;
77 continue;
78 }
79 if (_intStack.Length == 0)
80 {
81 break;
82 }
83 num = _intStack.Pop();
84 regexNode = regexNode.Next;
85 EmitFragment(regexNode.Type | 0x80, regexNode, num);
86 num++;
87 }
88 PatchJump(0, _emitted.Length);
89 Emit(40);
90 int[] codes = _emitted.AsSpan().ToArray();
91 bool rightToLeft = (tree.Options & RegexOptions.RightToLeft) != 0;
92 bool flag = (tree.Options & RegexOptions.Compiled) != 0;
94 (string, bool)[] array = null;
96 if (text.Length > 1 && text.Length <= 50000)
97 {
98 CultureInfo culture = (((tree.Options & RegexOptions.CultureInvariant) != 0) ? CultureInfo.InvariantCulture : CultureInfo.CurrentCulture);
99 regexBoyerMoore = new RegexBoyerMoore(text, caseInsensitive, rightToLeft, culture);
100 }
101 if (regexBoyerMoore == null || (regexBoyerMoore.NegativeUnicode != null && flag))
102 {
103 regexBoyerMoore = null;
104 if ((tree.Options & RegexOptions.Compiled) != 0)
105 {
107 }
108 if (array == null)
109 {
111 }
112 }
114 string[] array2 = new string[_stringTable.Count];
116 {
117 array2[item.Value] = item.Key;
118 }
120 }
121
122 private void PatchJump(int offset, int jumpDest)
123 {
124 _emitted[offset + 1] = jumpDest;
125 }
126
127 private void Emit(int op)
128 {
130 {
131 _trackCount++;
132 }
133 _emitted.Append(op);
134 }
135
136 private void Emit(int op, int opd1)
137 {
139 {
140 _trackCount++;
141 }
142 _emitted.Append(op);
143 _emitted.Append(opd1);
144 }
145
146 private void Emit(int op, int opd1, int opd2)
147 {
149 {
150 _trackCount++;
151 }
152 _emitted.Append(op);
153 _emitted.Append(opd1);
154 _emitted.Append(opd2);
155 }
156
157 private int StringCode(string str)
158 {
160 {
163 }
164 return value;
165 }
166
167 private int MapCapnum(int capnum)
168 {
169 if (capnum != -1)
170 {
171 if (_caps == null)
172 {
173 return capnum;
174 }
175 return (int)_caps[capnum];
176 }
177 return -1;
178 }
179
181 {
182 int num = 0;
183 if (node.UseOptionR())
184 {
185 num |= 0x40;
186 }
187 if ((node.Options & RegexOptions.IgnoreCase) != 0)
188 {
189 num |= 0x200;
190 }
191 switch (nodetype)
192 {
193 case 88:
194 if (curIndex < node.ChildCount() - 1)
195 {
196 _intStack.Append(_emitted.Length);
197 Emit(23, 0);
198 }
199 break;
200 case 152:
201 if (curIndex < node.ChildCount() - 1)
202 {
203 int offset = _intStack.Pop();
204 _intStack.Append(_emitted.Length);
205 Emit(38, 0);
206 PatchJump(offset, _emitted.Length);
207 }
208 else
209 {
210 for (int i = 0; i < curIndex; i++)
211 {
212 PatchJump(_intStack.Pop(), _emitted.Length);
213 }
214 }
215 break;
216 case 97:
217 if (curIndex == 0)
218 {
219 Emit(34);
220 _intStack.Append(_emitted.Length);
221 Emit(23, 0);
222 Emit(37, MapCapnum(node.M));
223 Emit(36);
224 }
225 break;
226 case 161:
227 switch (curIndex)
228 {
229 case 0:
230 {
231 int offset3 = _intStack.Pop();
232 _intStack.Append(_emitted.Length);
233 Emit(38, 0);
234 PatchJump(offset3, _emitted.Length);
235 Emit(36);
236 if (node.ChildCount() > 1)
237 {
238 break;
239 }
240 goto case 1;
241 }
242 case 1:
243 PatchJump(_intStack.Pop(), _emitted.Length);
244 break;
245 }
246 break;
247 case 98:
248 if (curIndex == 0)
249 {
250 Emit(34);
251 Emit(31);
252 _intStack.Append(_emitted.Length);
253 Emit(23, 0);
254 }
255 break;
256 case 162:
257 switch (curIndex)
258 {
259 case 0:
260 Emit(33);
261 Emit(36);
262 break;
263 case 1:
264 {
265 int offset2 = _intStack.Pop();
266 _intStack.Append(_emitted.Length);
267 Emit(38, 0);
268 PatchJump(offset2, _emitted.Length);
269 Emit(33);
270 Emit(36);
271 if (node.ChildCount() > 2)
272 {
273 break;
274 }
275 goto case 2;
276 }
277 case 2:
278 PatchJump(_intStack.Pop(), _emitted.Length);
279 break;
280 }
281 break;
282 case 90:
283 case 91:
284 if (node.N < int.MaxValue || node.M > 1)
285 {
286 Emit((node.M == 0) ? 26 : 27, (node.M != 0) ? (1 - node.M) : 0);
287 }
288 else
289 {
290 Emit((node.M == 0) ? 30 : 31);
291 }
292 if (node.M == 0)
293 {
294 _intStack.Append(_emitted.Length);
295 Emit(38, 0);
296 }
297 _intStack.Append(_emitted.Length);
298 break;
299 case 154:
300 case 155:
301 {
302 int length = _emitted.Length;
303 int num2 = nodetype - 154;
304 if (node.N < int.MaxValue || node.M > 1)
305 {
306 Emit(28 + num2, _intStack.Pop(), (node.N == int.MaxValue) ? int.MaxValue : (node.N - node.M));
307 }
308 else
309 {
310 Emit(24 + num2, _intStack.Pop());
311 }
312 if (node.M == 0)
313 {
314 PatchJump(_intStack.Pop(), length);
315 }
316 break;
317 }
318 case 92:
319 Emit(31);
320 break;
321 case 156:
322 Emit(32, MapCapnum(node.M), MapCapnum(node.N));
323 break;
324 case 94:
325 Emit(34);
326 Emit(31);
327 break;
328 case 158:
329 Emit(33);
330 Emit(36);
331 break;
332 case 95:
333 Emit(34);
334 _intStack.Append(_emitted.Length);
335 Emit(23, 0);
336 break;
337 case 159:
338 Emit(35);
339 PatchJump(_intStack.Pop(), _emitted.Length);
340 Emit(36);
341 break;
342 case 96:
343 Emit(34);
344 break;
345 case 160:
346 Emit(36);
347 break;
348 case 9:
349 case 10:
350 Emit(node.Type | num, node.Ch);
351 break;
352 case 3:
353 case 4:
354 case 6:
355 case 7:
356 case 43:
357 case 44:
358 if (node.M > 0)
359 {
360 Emit(((node.Type != 3 && node.Type != 43 && node.Type != 6) ? 1 : 0) | num, node.Ch, node.M);
361 }
362 if (node.N > node.M)
363 {
364 Emit(node.Type | num, node.Ch, (node.N == int.MaxValue) ? int.MaxValue : (node.N - node.M));
365 }
366 break;
367 case 5:
368 case 8:
369 case 45:
370 {
371 int opd = StringCode(node.Str);
372 if (node.M > 0)
373 {
374 Emit(2 | num, opd, node.M);
375 }
376 if (node.N > node.M)
377 {
378 Emit(node.Type | num, opd, (node.N == int.MaxValue) ? int.MaxValue : (node.N - node.M));
379 }
380 break;
381 }
382 case 12:
383 Emit(node.Type | num, StringCode(node.Str));
384 break;
385 case 11:
386 Emit(node.Type | num, StringCode(node.Str));
387 break;
388 case 13:
389 Emit(node.Type | num, MapCapnum(node.M));
390 break;
391 case 14:
392 case 15:
393 case 16:
394 case 17:
395 case 18:
396 case 19:
397 case 20:
398 case 21:
399 case 22:
400 case 41:
401 case 42:
402 case 46:
403 Emit(node.Type);
404 break;
405 default:
407 case 23:
408 case 89:
409 case 93:
410 case 153:
411 case 157:
412 break;
413 }
414 }
415}
bool TryGetValue(TKey key, [MaybeNullWhen(false)] out TValue value)
void Add(TKey key, TValue value)
static CultureInfo CurrentCulture
static string Format(string resourceFormat, object p1)
Definition SR.cs:118
static string UnexpectedOpcode
Definition SR.cs:94
Definition SR.cs:7
static string bool CaseInsensitive ComputeLeadingSubstring(RegexTree tree)
static string bool CaseInsensitive[] ComputeMultipleCharClasses(RegexTree tree, int maxChars)
static string bool CaseInsensitive[] ComputeFirstCharClass(RegexTree tree)
void Emit(int op, int opd1, int opd2)
RegexWriter(Span< int > emittedSpan, Span< int > intStackSpan)
System.Collections.Generic.ValueListBuilder< int > _intStack
System.Collections.Generic.ValueListBuilder< int > _emitted
RegexCode RegexCodeFromRegexTree(RegexTree tree)
readonly Dictionary< string, int > _stringTable
Definition RegexWriter.cs:9
void PatchJump(int offset, int jumpDest)
static RegexCode Write(RegexTree tree)
void EmitFragment(int nodetype, RegexNode node, int curIndex)