scripts
This commit is contained in:
@@ -0,0 +1,255 @@
|
||||
using System;
|
||||
|
||||
namespace System.Text.RegularExpressions
|
||||
{
|
||||
// Token: 0x020002CD RID: 717
|
||||
internal class Disassembler
|
||||
{
|
||||
// Token: 0x06001A13 RID: 6675 RVA: 0x0005CC60 File Offset: 0x0005AE60
|
||||
public static void DisassemblePattern(ushort[] image)
|
||||
{
|
||||
Disassembler.DisassembleBlock(image, 0, 0);
|
||||
}
|
||||
|
||||
// Token: 0x06001A14 RID: 6676 RVA: 0x0005CC6C File Offset: 0x0005AE6C
|
||||
public static void DisassembleBlock(ushort[] image, int pc, int depth)
|
||||
{
|
||||
while (pc < image.Length)
|
||||
{
|
||||
OpCode opCode;
|
||||
OpFlags opFlags;
|
||||
PatternCompiler.DecodeOp(image[pc], out opCode, out opFlags);
|
||||
Console.Write(Disassembler.FormatAddress(pc) + ": ");
|
||||
Console.Write(new string(' ', depth * 2));
|
||||
Console.Write(Disassembler.DisassembleOp(image, pc));
|
||||
Console.WriteLine();
|
||||
int num;
|
||||
switch (opCode)
|
||||
{
|
||||
case OpCode.False:
|
||||
case OpCode.True:
|
||||
case OpCode.Until:
|
||||
num = 1;
|
||||
break;
|
||||
case OpCode.Position:
|
||||
case OpCode.Reference:
|
||||
case OpCode.Character:
|
||||
case OpCode.Category:
|
||||
case OpCode.NotCategory:
|
||||
case OpCode.In:
|
||||
case OpCode.Open:
|
||||
case OpCode.Close:
|
||||
case OpCode.Sub:
|
||||
case OpCode.Branch:
|
||||
case OpCode.Jump:
|
||||
num = 2;
|
||||
break;
|
||||
case OpCode.String:
|
||||
num = (int)(image[pc + 1] + 2);
|
||||
break;
|
||||
case OpCode.Range:
|
||||
case OpCode.Balance:
|
||||
case OpCode.IfDefined:
|
||||
case OpCode.Test:
|
||||
case OpCode.Anchor:
|
||||
num = 3;
|
||||
break;
|
||||
case OpCode.Set:
|
||||
num = (int)(image[pc + 2] + 3);
|
||||
break;
|
||||
case OpCode.BalanceStart:
|
||||
goto IL_F7;
|
||||
case OpCode.Repeat:
|
||||
case OpCode.FastRepeat:
|
||||
case OpCode.Info:
|
||||
num = 4;
|
||||
break;
|
||||
default:
|
||||
goto IL_F7;
|
||||
}
|
||||
IL_FE:
|
||||
pc += num;
|
||||
continue;
|
||||
IL_F7:
|
||||
num = 1;
|
||||
goto IL_FE;
|
||||
}
|
||||
}
|
||||
|
||||
// Token: 0x06001A15 RID: 6677 RVA: 0x0005CD80 File Offset: 0x0005AF80
|
||||
public static string DisassembleOp(ushort[] image, int pc)
|
||||
{
|
||||
OpCode opCode;
|
||||
OpFlags opFlags;
|
||||
PatternCompiler.DecodeOp(image[pc], out opCode, out opFlags);
|
||||
string text = opCode.ToString();
|
||||
if (opFlags != OpFlags.None)
|
||||
{
|
||||
text = text + "[" + opFlags.ToString("f") + "]";
|
||||
}
|
||||
switch (opCode)
|
||||
{
|
||||
case OpCode.Position:
|
||||
text = text + " /" + (Position)image[pc + 1];
|
||||
break;
|
||||
case OpCode.String:
|
||||
text = text + " '" + Disassembler.ReadString(image, pc + 1) + "'";
|
||||
break;
|
||||
case OpCode.Reference:
|
||||
case OpCode.Open:
|
||||
case OpCode.Close:
|
||||
text = text + " " + image[pc + 1];
|
||||
break;
|
||||
case OpCode.Character:
|
||||
text = text + " '" + Disassembler.FormatChar((char)image[pc + 1]) + "'";
|
||||
break;
|
||||
case OpCode.Category:
|
||||
case OpCode.NotCategory:
|
||||
text = text + " /" + (Category)image[pc + 1];
|
||||
break;
|
||||
case OpCode.Range:
|
||||
text = text + " '" + Disassembler.FormatChar((char)image[pc + 1]) + "', ";
|
||||
text = text + " '" + Disassembler.FormatChar((char)image[pc + 2]) + "'";
|
||||
break;
|
||||
case OpCode.Set:
|
||||
text = text + " " + Disassembler.FormatSet(image, pc + 1);
|
||||
break;
|
||||
case OpCode.In:
|
||||
case OpCode.Sub:
|
||||
case OpCode.Branch:
|
||||
case OpCode.Jump:
|
||||
text = text + " :" + Disassembler.FormatAddress(pc + (int)image[pc + 1]);
|
||||
break;
|
||||
case OpCode.Balance:
|
||||
{
|
||||
string text2 = text;
|
||||
text = string.Concat(new object[]
|
||||
{
|
||||
text2,
|
||||
" ",
|
||||
image[pc + 1],
|
||||
" ",
|
||||
image[pc + 2]
|
||||
});
|
||||
break;
|
||||
}
|
||||
case OpCode.IfDefined:
|
||||
case OpCode.Anchor:
|
||||
text = text + " :" + Disassembler.FormatAddress(pc + (int)image[pc + 1]);
|
||||
text = text + " " + image[pc + 2];
|
||||
break;
|
||||
case OpCode.Test:
|
||||
text = text + " :" + Disassembler.FormatAddress(pc + (int)image[pc + 1]);
|
||||
text = text + ", :" + Disassembler.FormatAddress(pc + (int)image[pc + 2]);
|
||||
break;
|
||||
case OpCode.Repeat:
|
||||
case OpCode.FastRepeat:
|
||||
{
|
||||
text = text + " :" + Disassembler.FormatAddress(pc + (int)image[pc + 1]);
|
||||
string text2 = text;
|
||||
text = string.Concat(new object[]
|
||||
{
|
||||
text2,
|
||||
" (",
|
||||
image[pc + 2],
|
||||
", "
|
||||
});
|
||||
if (image[pc + 3] == 65535)
|
||||
{
|
||||
text += "Inf";
|
||||
}
|
||||
else
|
||||
{
|
||||
text += image[pc + 3];
|
||||
}
|
||||
text += ")";
|
||||
break;
|
||||
}
|
||||
case OpCode.Info:
|
||||
{
|
||||
text = text + " " + image[pc + 1];
|
||||
string text2 = text;
|
||||
text = string.Concat(new object[]
|
||||
{
|
||||
text2,
|
||||
" (",
|
||||
image[pc + 2],
|
||||
", ",
|
||||
image[pc + 3],
|
||||
")"
|
||||
});
|
||||
break;
|
||||
}
|
||||
}
|
||||
return text;
|
||||
}
|
||||
|
||||
// Token: 0x06001A16 RID: 6678 RVA: 0x0005D0DC File Offset: 0x0005B2DC
|
||||
private static string ReadString(ushort[] image, int pc)
|
||||
{
|
||||
int num = (int)image[pc];
|
||||
char[] array = new char[num];
|
||||
for (int i = 0; i < num; i++)
|
||||
{
|
||||
array[i] = (char)image[pc + i + 1];
|
||||
}
|
||||
return new string(array);
|
||||
}
|
||||
|
||||
// Token: 0x06001A17 RID: 6679 RVA: 0x0005D118 File Offset: 0x0005B318
|
||||
private static string FormatAddress(int pc)
|
||||
{
|
||||
return pc.ToString("x4");
|
||||
}
|
||||
|
||||
// Token: 0x06001A18 RID: 6680 RVA: 0x0005D128 File Offset: 0x0005B328
|
||||
private static string FormatSet(ushort[] image, int pc)
|
||||
{
|
||||
int num = (int)image[pc++];
|
||||
int num2 = ((int)image[pc++] << 4) - 1;
|
||||
string text = "[";
|
||||
bool flag = false;
|
||||
char c = '\0';
|
||||
for (int i = 0; i <= num2; i++)
|
||||
{
|
||||
bool flag2 = ((int)image[pc + (i >> 4)] & (1 << (i & 15))) != 0;
|
||||
if (flag2 & !flag)
|
||||
{
|
||||
c = (char)(num + i);
|
||||
flag = true;
|
||||
}
|
||||
else if (flag & (!flag2 || i == num2))
|
||||
{
|
||||
char c2 = (char)(num + i - 1);
|
||||
text += Disassembler.FormatChar(c);
|
||||
if (c2 != c)
|
||||
{
|
||||
text = text + "-" + Disassembler.FormatChar(c2);
|
||||
}
|
||||
flag = false;
|
||||
}
|
||||
}
|
||||
return text + "]";
|
||||
}
|
||||
|
||||
// Token: 0x06001A19 RID: 6681 RVA: 0x0005D1FC File Offset: 0x0005B3FC
|
||||
private static string FormatChar(char c)
|
||||
{
|
||||
if (c == '-' || c == ']')
|
||||
{
|
||||
return "\\" + c;
|
||||
}
|
||||
if (char.IsLetterOrDigit(c) || char.IsSymbol(c))
|
||||
{
|
||||
return c.ToString();
|
||||
}
|
||||
if (char.IsControl(c))
|
||||
{
|
||||
return "^" + ('@' + c);
|
||||
}
|
||||
string text = "\\u";
|
||||
int num = (int)c;
|
||||
return text + num.ToString("x4");
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user