Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
RegexInterpreter.cs
Go to the documentation of this file.
3
5
6internal sealed class RegexInterpreter : RegexRunner
7{
8 private readonly RegexCode _code;
9
10 private readonly TextInfo _textInfo;
11
12 private int _operator;
13
14 private int _codepos;
15
16 private bool _rightToLeft;
17
18 private bool _caseInsensitive;
19
21 {
22 _code = code;
24 }
25
26 protected override void InitTrackCount()
27 {
29 }
30
31 private void Advance(int i)
32 {
33 _codepos += i + 1;
35 }
36
37 private void Goto(int newpos)
38 {
39 if (newpos < _codepos)
40 {
42 }
43 _codepos = newpos;
44 SetOperator(_code.Codes[newpos]);
45 }
46
47 private void Trackto(int newpos)
48 {
49 runtrackpos = runtrack.Length - newpos;
50 }
51
52 private int Trackpos()
53 {
54 return runtrack.Length - runtrackpos;
55 }
56
57 private void TrackPush()
58 {
60 }
61
62 private void TrackPush(int i1)
63 {
64 int[] array = runtrack;
65 int num = runtrackpos;
66 array[--num] = i1;
67 array[--num] = _codepos;
68 runtrackpos = num;
69 }
70
71 private void TrackPush(int i1, int i2)
72 {
73 int[] array = runtrack;
74 int num = runtrackpos;
75 array[--num] = i1;
76 array[--num] = i2;
77 array[--num] = _codepos;
78 runtrackpos = num;
79 }
80
81 private void TrackPush(int i1, int i2, int i3)
82 {
83 int[] array = runtrack;
84 int num = runtrackpos;
85 array[--num] = i1;
86 array[--num] = i2;
87 array[--num] = i3;
88 array[--num] = _codepos;
89 runtrackpos = num;
90 }
91
92 private void TrackPush2(int i1)
93 {
94 int[] array = runtrack;
95 int num = runtrackpos;
96 array[--num] = i1;
97 array[--num] = -_codepos;
98 runtrackpos = num;
99 }
100
101 private void TrackPush2(int i1, int i2)
102 {
103 int[] array = runtrack;
104 int num = runtrackpos;
105 array[--num] = i1;
106 array[--num] = i2;
107 array[--num] = -_codepos;
108 runtrackpos = num;
109 }
110
111 private void Backtrack()
112 {
113 int num = runtrack[runtrackpos];
114 runtrackpos++;
115 int num2 = 128;
116 if (num < 0)
117 {
118 num = -num;
119 num2 = 256;
120 }
121 SetOperator(_code.Codes[num] | num2);
122 if (num < _codepos)
123 {
125 }
126 _codepos = num;
127 }
128
129 [MethodImpl(MethodImplOptions.AggressiveInlining)]
130 private void SetOperator(int op)
131 {
132 _operator = op & -577;
133 _caseInsensitive = (op & 0x200) != 0;
134 _rightToLeft = (op & 0x40) != 0;
135 }
136
137 private void TrackPop()
138 {
139 runtrackpos++;
140 }
141
142 private void TrackPop(int framesize)
143 {
144 runtrackpos += framesize;
145 }
146
147 private int TrackPeek()
148 {
149 return runtrack[runtrackpos - 1];
150 }
151
152 private int TrackPeek(int i)
153 {
154 return runtrack[runtrackpos - i - 1];
155 }
156
157 private void StackPush(int i1)
158 {
159 runstack[--runstackpos] = i1;
160 }
161
162 private void StackPush(int i1, int i2)
163 {
164 int[] array = runstack;
165 int num = runstackpos;
166 array[--num] = i1;
167 array[--num] = i2;
168 runstackpos = num;
169 }
170
171 private void StackPop()
172 {
173 runstackpos++;
174 }
175
176 private void StackPop(int framesize)
177 {
178 runstackpos += framesize;
179 }
180
181 private int StackPeek()
182 {
183 return runstack[runstackpos - 1];
184 }
185
186 private int StackPeek(int i)
187 {
188 return runstack[runstackpos - i - 1];
189 }
190
191 private int Operand(int i)
192 {
193 return _code.Codes[_codepos + i + 1];
194 }
195
196 private int Leftchars()
197 {
198 return runtextpos - runtextbeg;
199 }
200
201 private int Rightchars()
202 {
203 return runtextend - runtextpos;
204 }
205
206 private int Bump()
207 {
208 if (!_rightToLeft)
209 {
210 return 1;
211 }
212 return -1;
213 }
214
215 private int Forwardchars()
216 {
217 if (!_rightToLeft)
218 {
219 return runtextend - runtextpos;
220 }
221 return runtextpos - runtextbeg;
222 }
223
224 private char Forwardcharnext()
225 {
226 char c = (_rightToLeft ? runtext[--runtextpos] : runtext[runtextpos++]);
227 if (!_caseInsensitive)
228 {
229 return c;
230 }
231 return _textInfo.ToLower(c);
232 }
233
234 private bool MatchString(string str)
235 {
236 int num = str.Length;
237 int num2;
238 if (!_rightToLeft)
239 {
240 if (runtextend - runtextpos < num)
241 {
242 return false;
243 }
244 num2 = runtextpos + num;
245 }
246 else
247 {
248 if (runtextpos - runtextbeg < num)
249 {
250 return false;
251 }
252 num2 = runtextpos;
253 }
254 if (!_caseInsensitive)
255 {
256 while (num != 0)
257 {
258 if (str[--num] != runtext[--num2])
259 {
260 return false;
261 }
262 }
263 }
264 else
265 {
266 TextInfo textInfo = _textInfo;
267 while (num != 0)
268 {
269 if (str[--num] != textInfo.ToLower(runtext[--num2]))
270 {
271 return false;
272 }
273 }
274 }
275 if (!_rightToLeft)
276 {
277 num2 += str.Length;
278 }
279 runtextpos = num2;
280 return true;
281 }
282
283 private bool MatchRef(int index, int length)
284 {
285 int num;
286 if (!_rightToLeft)
287 {
289 {
290 return false;
291 }
292 num = runtextpos + length;
293 }
294 else
295 {
297 {
298 return false;
299 }
300 num = runtextpos;
301 }
302 int num2 = index + length;
303 int num3 = length;
304 if (!_caseInsensitive)
305 {
306 while (num3-- != 0)
307 {
308 if (runtext[--num2] != runtext[--num])
309 {
310 return false;
311 }
312 }
313 }
314 else
315 {
316 TextInfo textInfo = _textInfo;
317 while (num3-- != 0)
318 {
319 if (textInfo.ToLower(runtext[--num2]) != textInfo.ToLower(runtext[--num]))
320 {
321 return false;
322 }
323 }
324 }
325 if (!_rightToLeft)
326 {
327 num += length;
328 }
329 runtextpos = num;
330 return true;
331 }
332
333 private void Backwardnext()
334 {
335 runtextpos += (_rightToLeft ? 1 : (-1));
336 }
337
338 protected override bool FindFirstChar()
339 {
340 if (!_code.RightToLeft)
341 {
343 {
345 return false;
346 }
347 }
349 {
351 return false;
352 }
353 if (((uint)_code.LeadingAnchor & 0x35u) != 0)
354 {
355 if (!_code.RightToLeft)
356 {
357 int leadingAnchor = _code.LeadingAnchor;
358 if (leadingAnchor <= 4)
359 {
360 if (leadingAnchor != 1)
361 {
362 if (leadingAnchor == 4 && runtextpos > runtextstart)
363 {
364 goto IL_00da;
365 }
366 }
367 else if (runtextpos > runtextbeg)
368 {
369 goto IL_00da;
370 }
371 }
372 else
373 {
374 switch (leadingAnchor)
375 {
376 case 16:
377 if (runtextpos < runtextend - 1)
378 {
380 }
381 break;
382 case 32:
384 {
386 }
387 break;
388 }
389 }
390 }
391 else
392 {
393 int leadingAnchor2 = _code.LeadingAnchor;
394 if (leadingAnchor2 <= 4)
395 {
396 if (leadingAnchor2 != 1)
397 {
398 if (leadingAnchor2 == 4 && runtextpos < runtextstart)
399 {
400 goto IL_01ac;
401 }
402 }
403 else if (runtextpos > runtextbeg)
404 {
406 }
407 }
408 else if (leadingAnchor2 != 16)
409 {
410 if (leadingAnchor2 == 32 && runtextpos < runtextend)
411 {
412 goto IL_01ac;
413 }
414 }
415 else if (runtextpos < runtextend - 1 || (runtextpos == runtextend - 1 && runtext[runtextpos] != '\n'))
416 {
417 goto IL_01ac;
418 }
419 }
420 if (_code.BoyerMoorePrefix != null)
421 {
423 }
424 return true;
425 }
427 {
428 int num = runtext.IndexOf('\n', runtextpos);
429 if (num == -1 || num + 1 > runtextend)
430 {
432 return false;
433 }
434 runtextpos = num + 1;
435 }
436 if (_code.BoyerMoorePrefix != null)
437 {
439 if (runtextpos == -1)
440 {
441 runtextpos = (_code.RightToLeft ? runtextbeg : runtextend);
442 return false;
443 }
444 return true;
445 }
446 if (_code.LeadingCharClasses == null)
447 {
448 return true;
449 }
450 string item = _code.LeadingCharClasses[0].CharClass;
452 {
454 if (!_code.RightToLeft)
455 {
457 if (!_code.LeadingCharClasses[0].CaseInsensitive)
458 {
459 int num2 = span.IndexOf(c);
460 if (num2 >= 0)
461 {
462 runtextpos += num2;
463 return true;
464 }
465 }
466 else
467 {
468 TextInfo textInfo = _textInfo;
469 for (int i = 0; i < span.Length; i++)
470 {
471 if (c == textInfo.ToLower(span[i]))
472 {
473 runtextpos += i;
474 return true;
475 }
476 }
477 }
479 }
480 else
481 {
482 if (!_code.LeadingCharClasses[0].CaseInsensitive)
483 {
484 for (int num3 = runtextpos - 1; num3 >= runtextbeg; num3--)
485 {
486 if (c == runtext[num3])
487 {
488 runtextpos = num3 + 1;
489 return true;
490 }
491 }
492 }
493 else
494 {
495 TextInfo textInfo2 = _textInfo;
496 for (int num4 = runtextpos - 1; num4 >= runtextbeg; num4--)
497 {
498 if (c == textInfo2.ToLower(runtext[num4]))
499 {
500 runtextpos = num4 + 1;
501 return true;
502 }
503 }
504 }
506 }
507 }
508 else if (!_code.RightToLeft)
509 {
511 if (!_code.LeadingCharClasses[0].CaseInsensitive)
512 {
513 for (int j = 0; j < readOnlySpan.Length; j++)
514 {
516 {
517 runtextpos += j;
518 return true;
519 }
520 }
521 }
522 else
523 {
524 TextInfo textInfo3 = _textInfo;
525 for (int k = 0; k < readOnlySpan.Length; k++)
526 {
527 if (RegexCharClass.CharInClass(textInfo3.ToLower(readOnlySpan[k]), item, ref _code.LeadingCharClassAsciiLookup))
528 {
529 runtextpos += k;
530 return true;
531 }
532 }
533 }
535 }
536 else
537 {
538 if (!_code.LeadingCharClasses[0].CaseInsensitive)
539 {
540 for (int num5 = runtextpos - 1; num5 >= runtextbeg; num5--)
541 {
543 {
544 runtextpos = num5 + 1;
545 return true;
546 }
547 }
548 }
549 else
550 {
551 TextInfo textInfo4 = _textInfo;
552 for (int num6 = runtextpos - 1; num6 >= runtextbeg; num6--)
553 {
555 {
556 runtextpos = num6 + 1;
557 return true;
558 }
559 }
560 }
562 }
563 return false;
564 IL_01ac:
566 return false;
567 IL_00da:
569 return false;
570 }
571
572 protected override void Go()
573 {
575 _codepos = 0;
576 int num = -1;
577 while (true)
578 {
579 if (num >= 0)
580 {
581 Advance(num);
582 num = -1;
583 }
584 CheckTimeout();
585 switch (_operator)
586 {
587 case 40:
588 return;
589 case 38:
590 Goto(Operand(0));
591 continue;
592 case 37:
593 if (IsMatched(Operand(0)))
594 {
595 num = 1;
596 continue;
597 }
598 break;
599 case 23:
601 num = 1;
602 continue;
603 case 151:
604 TrackPop();
606 Goto(Operand(0));
607 continue;
608 case 31:
610 TrackPush();
611 num = 0;
612 continue;
613 case 30:
614 StackPush(-1);
615 TrackPush();
616 num = 0;
617 continue;
618 case 158:
619 case 159:
620 StackPop();
621 break;
622 case 33:
623 StackPop();
626 num = 0;
627 continue;
628 case 161:
629 TrackPop();
631 break;
632 case 32:
633 if (Operand(1) == -1 || IsMatched(Operand(1)))
634 {
635 StackPop();
636 if (Operand(1) != -1)
637 {
639 }
640 else
641 {
643 }
645 num = 2;
646 continue;
647 }
648 break;
649 case 160:
650 TrackPop();
652 Uncapture();
653 if (Operand(0) != -1 && Operand(1) != -1)
654 {
655 Uncapture();
656 }
657 break;
658 case 24:
659 StackPop();
660 if (runtextpos != StackPeek())
661 {
664 Goto(Operand(0));
665 }
666 else
667 {
669 num = 1;
670 }
671 continue;
672 case 152:
673 TrackPop(2);
674 StackPop();
677 num = 1;
678 continue;
679 case 280:
680 TrackPop();
682 break;
683 case 25:
684 {
685 StackPop();
686 int num26 = StackPeek();
687 if (runtextpos != num26)
688 {
689 if (num26 != -1)
690 {
691 TrackPush(num26, runtextpos);
692 }
693 else
694 {
696 }
697 }
698 else
699 {
700 StackPush(num26);
702 }
703 num = 1;
704 continue;
705 }
706 case 153:
707 {
708 TrackPop(2);
709 int i2 = TrackPeek(1);
711 StackPush(i2);
712 runtextpos = i2;
713 Goto(Operand(0));
714 continue;
715 }
716 case 281:
717 StackPop();
718 TrackPop();
720 break;
721 case 27:
723 TrackPush();
724 num = 1;
725 continue;
726 case 26:
727 StackPush(-1, Operand(0));
728 TrackPush();
729 num = 1;
730 continue;
731 case 154:
732 case 155:
733 case 162:
734 StackPop(2);
735 break;
736 case 28:
737 {
738 StackPop(2);
739 int num17 = StackPeek();
740 int num18 = StackPeek(1);
741 int num19 = runtextpos - num17;
742 if (num18 >= Operand(1) || (num19 == 0 && num18 >= 0))
743 {
744 TrackPush2(num17, num18);
745 num = 2;
746 }
747 else
748 {
749 TrackPush(num17);
750 StackPush(runtextpos, num18 + 1);
751 Goto(Operand(0));
752 }
753 continue;
754 }
755 case 156:
756 TrackPop();
757 StackPop(2);
758 if (StackPeek(1) > 0)
759 {
761 TrackPush2(TrackPeek(), StackPeek(1) - 1);
762 num = 2;
763 continue;
764 }
765 StackPush(TrackPeek(), StackPeek(1) - 1);
766 break;
767 case 284:
768 TrackPop(2);
770 break;
771 case 29:
772 {
773 StackPop(2);
774 int i = StackPeek();
775 int num8 = StackPeek(1);
776 if (num8 < 0)
777 {
778 TrackPush2(i);
779 StackPush(runtextpos, num8 + 1);
780 Goto(Operand(0));
781 }
782 else
783 {
784 TrackPush(i, num8, runtextpos);
785 num = 2;
786 }
787 continue;
788 }
789 case 157:
790 {
791 TrackPop(3);
792 int num29 = TrackPeek();
793 int num30 = TrackPeek(2);
794 if (TrackPeek(1) < Operand(1) && num30 != num29)
795 {
796 runtextpos = num30;
797 StackPush(num30, TrackPeek(1) + 1);
798 TrackPush2(num29);
799 Goto(Operand(0));
800 continue;
801 }
803 break;
804 }
805 case 285:
806 TrackPop();
807 StackPop(2);
808 StackPush(TrackPeek(), StackPeek(1) - 1);
809 break;
810 case 34:
812 TrackPush();
813 num = 0;
814 continue;
815 case 35:
816 StackPop(2);
818 while (Crawlpos() != StackPeek(1))
819 {
820 Uncapture();
821 }
822 break;
823 case 36:
824 StackPop(2);
827 num = 0;
828 continue;
829 case 164:
830 TrackPop();
831 while (Crawlpos() != TrackPeek())
832 {
833 Uncapture();
834 }
835 break;
836 case 14:
837 if (Leftchars() <= 0 || runtext[runtextpos - 1] == '\n')
838 {
839 num = 0;
840 continue;
841 }
842 break;
843 case 15:
844 if (Rightchars() <= 0 || runtext[runtextpos] == '\n')
845 {
846 num = 0;
847 continue;
848 }
849 break;
850 case 16:
852 {
853 num = 0;
854 continue;
855 }
856 break;
857 case 17:
859 {
860 num = 0;
861 continue;
862 }
863 break;
864 case 41:
866 {
867 num = 0;
868 continue;
869 }
870 break;
871 case 42:
873 {
874 num = 0;
875 continue;
876 }
877 break;
878 case 18:
879 if (Leftchars() <= 0)
880 {
881 num = 0;
882 continue;
883 }
884 break;
885 case 19:
887 {
888 num = 0;
889 continue;
890 }
891 break;
892 case 20:
893 if (Rightchars() <= 1 && (Rightchars() != 1 || runtext[runtextpos] == '\n'))
894 {
895 num = 0;
896 continue;
897 }
898 break;
899 case 21:
900 if (Rightchars() <= 0)
901 {
902 num = 0;
903 continue;
904 }
905 break;
906 case 9:
907 if (Forwardchars() >= 1 && Forwardcharnext() == (ushort)Operand(0))
908 {
909 num = 1;
910 continue;
911 }
912 break;
913 case 10:
914 if (Forwardchars() >= 1 && Forwardcharnext() != (ushort)Operand(0))
915 {
916 num = 1;
917 continue;
918 }
919 break;
920 case 11:
921 if (Forwardchars() >= 1)
922 {
923 int num7 = Operand(0);
925 {
926 num = 1;
927 continue;
928 }
929 }
930 break;
931 case 12:
933 {
934 num = 1;
935 continue;
936 }
937 break;
938 case 13:
939 {
940 int cap = Operand(0);
941 if (IsMatched(cap))
942 {
943 if (!MatchRef(MatchIndex(cap), MatchLength(cap)))
944 {
945 break;
946 }
947 }
948 else if ((runregex.roptions & RegexOptions.ECMAScript) == 0)
949 {
950 break;
951 }
952 num = 1;
953 continue;
954 }
955 case 0:
956 {
957 int num28 = Operand(1);
958 if (Forwardchars() < num28)
959 {
960 break;
961 }
962 char c4 = (char)Operand(0);
963 while (num28-- > 0)
964 {
965 if (Forwardcharnext() != c4)
966 {
967 goto end_IL_0037;
968 }
969 }
970 num = 2;
971 continue;
972 }
973 case 1:
974 {
975 int num27 = Operand(1);
976 if (Forwardchars() < num27)
977 {
978 break;
979 }
980 char c3 = (char)Operand(0);
981 while (num27-- > 0)
982 {
983 if (Forwardcharnext() == c3)
984 {
985 goto end_IL_0037;
986 }
987 }
988 num = 2;
989 continue;
990 }
991 case 2:
992 {
993 int num24 = Operand(1);
994 if (Forwardchars() < num24)
995 {
996 break;
997 }
998 int num25 = Operand(0);
999 string set2 = _code.Strings[num25];
1000 ref int[] asciiResultCache2 = ref _code.StringsAsciiLookup[num25];
1001 while (num24-- > 0)
1002 {
1003 if ((uint)num24 % 2048u == 0)
1004 {
1005 CheckTimeout();
1006 }
1007 if (!RegexCharClass.CharInClass(Forwardcharnext(), set2, ref asciiResultCache2))
1008 {
1009 goto end_IL_0037;
1010 }
1011 }
1012 num = 2;
1013 continue;
1014 }
1015 case 3:
1016 case 43:
1017 {
1018 int num22 = Math.Min(Operand(1), Forwardchars());
1019 char c2 = (char)Operand(0);
1020 int num23;
1021 for (num23 = num22; num23 > 0; num23--)
1022 {
1023 if (Forwardcharnext() != c2)
1024 {
1025 Backwardnext();
1026 break;
1027 }
1028 }
1029 if (num22 > num23 && _operator == 3)
1030 {
1031 TrackPush(num22 - num23 - 1, runtextpos - Bump());
1032 }
1033 num = 2;
1034 continue;
1035 }
1036 case 4:
1037 case 44:
1038 {
1039 int num20 = Math.Min(Operand(1), Forwardchars());
1040 char c = (char)Operand(0);
1041 int num21;
1043 {
1044 num21 = runtext.AsSpan(runtextpos, num20).IndexOf(c);
1045 if (num21 == -1)
1046 {
1047 runtextpos += num20;
1048 num21 = 0;
1049 }
1050 else
1051 {
1052 runtextpos += num21;
1053 num21 = num20 - num21;
1054 }
1055 }
1056 else
1057 {
1058 for (num21 = num20; num21 > 0; num21--)
1059 {
1060 if (Forwardcharnext() == c)
1061 {
1062 Backwardnext();
1063 break;
1064 }
1065 }
1066 }
1067 if (num20 > num21 && _operator == 4)
1068 {
1069 TrackPush(num20 - num21 - 1, runtextpos - Bump());
1070 }
1071 num = 2;
1072 continue;
1073 }
1074 case 5:
1075 case 45:
1076 {
1077 int num14 = Math.Min(Operand(1), Forwardchars());
1078 int num15 = Operand(0);
1079 string set = _code.Strings[num15];
1080 ref int[] asciiResultCache = ref _code.StringsAsciiLookup[num15];
1081 int num16;
1082 for (num16 = num14; num16 > 0; num16--)
1083 {
1084 if ((uint)num16 % 2048u == 0)
1085 {
1086 CheckTimeout();
1087 }
1088 if (!RegexCharClass.CharInClass(Forwardcharnext(), set, ref asciiResultCache))
1089 {
1090 Backwardnext();
1091 break;
1092 }
1093 }
1094 if (num14 > num16 && _operator == 5)
1095 {
1096 TrackPush(num14 - num16 - 1, runtextpos - Bump());
1097 }
1098 num = 2;
1099 continue;
1100 }
1101 case 131:
1102 case 132:
1103 case 133:
1104 {
1105 TrackPop(2);
1106 int num12 = TrackPeek();
1107 int num13 = (runtextpos = TrackPeek(1));
1108 if (num12 > 0)
1109 {
1110 TrackPush(num12 - 1, num13 - Bump());
1111 }
1112 num = 2;
1113 continue;
1114 }
1115 case 6:
1116 case 7:
1117 case 8:
1118 {
1119 int num11 = Math.Min(Operand(1), Forwardchars());
1120 if (num11 > 0)
1121 {
1122 TrackPush(num11 - 1, runtextpos);
1123 }
1124 num = 2;
1125 continue;
1126 }
1127 case 134:
1128 {
1129 TrackPop(2);
1130 int num9 = (runtextpos = TrackPeek(1));
1131 if (Forwardcharnext() == (ushort)Operand(0))
1132 {
1133 int num10 = TrackPeek();
1134 if (num10 > 0)
1135 {
1136 TrackPush(num10 - 1, num9 + Bump());
1137 }
1138 num = 2;
1139 continue;
1140 }
1141 break;
1142 }
1143 case 135:
1144 {
1145 TrackPop(2);
1146 int num5 = (runtextpos = TrackPeek(1));
1147 if (Forwardcharnext() != (ushort)Operand(0))
1148 {
1149 int num6 = TrackPeek();
1150 if (num6 > 0)
1151 {
1152 TrackPush(num6 - 1, num5 + Bump());
1153 }
1154 num = 2;
1155 continue;
1156 }
1157 break;
1158 }
1159 case 136:
1160 {
1161 TrackPop(2);
1162 int num2 = (runtextpos = TrackPeek(1));
1163 int num3 = Operand(0);
1165 {
1166 int num4 = TrackPeek();
1167 if (num4 > 0)
1168 {
1169 TrackPush(num4 - 1, num2 + Bump());
1170 }
1171 num = 2;
1172 continue;
1173 }
1174 break;
1175 }
1176 case 46:
1177 {
1178 runtrack[runtrack.Length - 1] = runtextpos;
1179 num = 0;
1180 continue;
1181 }
1182 end_IL_0037:
1183 break;
1184 }
1185 Backtrack();
1186 }
1187 }
1188}
TextInfo(CultureData cultureData)
Definition TextInfo.cs:99
static byte Min(byte val1, byte val2)
Definition Math.cs:912
int Scan(string text, int index, int beglimit, int endlimit)
bool IsMatch(string text, int index, int beglimit, int endlimit)
static bool CharInClass(char ch, string set, ref int[] asciiResultCache)
readonly RegexBoyerMoore BoyerMoorePrefix
Definition RegexCode.cs:25
RegexInterpreter(RegexCode code, CultureInfo culture)
void TransferCapture(int capnum, int uncapnum, int start, int end)
bool IsECMABoundary(int index, int startpos, int endpos)
bool IsBoundary(int index, int startpos, int endpos)
void Capture(int capnum, int start, int end)