Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches

◆ RegexCodeFromRegexTree()

RegexCode System.Text.RegularExpressions.RegexWriter.RegexCodeFromRegexTree ( RegexTree tree)
inline

Definition at line 44 of file RegexWriter.cs.

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);
62 RegexNode regexNode = tree.Root;
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;
93 RegexBoyerMoore regexBoyerMoore = null;
94 (string, bool)[] array = null;
95 var (text, caseInsensitive) = RegexPrefixAnalyzer.ComputeLeadingSubstring(tree);
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 {
106 array = RegexPrefixAnalyzer.ComputeMultipleCharClasses(tree, 5);
107 }
108 if (array == null)
109 {
110 array = RegexPrefixAnalyzer.ComputeFirstCharClass(tree);
111 }
112 }
113 int leadingAnchor = RegexPrefixAnalyzer.FindLeadingAnchor(tree);
114 string[] array2 = new string[_stringTable.Count];
116 {
117 array2[item.Value] = item.Key;
118 }
119 return new RegexCode(tree, codes, array2, _trackCount, _caps, capsize, regexBoyerMoore, array, leadingAnchor, rightToLeft);
120 }
static CultureInfo CurrentCulture
System.Collections.Generic.ValueListBuilder< int > _intStack
System.Collections.Generic.ValueListBuilder< int > _emitted
readonly Dictionary< string, int > _stringTable
Definition RegexWriter.cs:9
void PatchJump(int offset, int jumpDest)
void EmitFragment(int nodetype, RegexNode node, int curIndex)

References System.Text.RegularExpressions.RegexWriter._caps, System.Text.RegularExpressions.RegexWriter._emitted, System.Text.RegularExpressions.RegexWriter._intStack, System.Text.RegularExpressions.RegexWriter._stringTable, System.Text.RegularExpressions.RegexWriter._trackCount, System.Text.RegularExpressions.array, System.Text.RegularExpressions.RegexPrefixAnalyzer.ComputeFirstCharClass(), System.Text.RegularExpressions.RegexPrefixAnalyzer.ComputeLeadingSubstring(), System.Text.RegularExpressions.RegexPrefixAnalyzer.ComputeMultipleCharClasses(), System.Collections.Generic.Dictionary< TKey, TValue >.Count, System.culture, System.Globalization.CultureInfo.CurrentCulture, System.Text.RegularExpressions.RegexWriter.Emit(), System.Text.RegularExpressions.RegexWriter.EmitFragment(), System.Text.RegularExpressions.RegexPrefixAnalyzer.FindLeadingAnchor(), System.Text.RegularExpressions.i, System.item, System.Text.RegularExpressions.RegexWriter.PatchJump(), and System.text.