using System; using System.Globalization; namespace System.Text.RegularExpressions { // Token: 0x020002B6 RID: 694 internal sealed class RxInterpreter : BaseMachine { // Token: 0x06001971 RID: 6513 RVA: 0x00056B9C File Offset: 0x00054D9C public RxInterpreter(byte[] program, EvalDelegate eval_del) { this.program = program; this.eval_del = eval_del; this.group_count = 1 + ((int)program[1] | ((int)program[2] << 8)); this.groups = new int[this.group_count]; this.stack = default(RxInterpreter.IntStack); this.ResetGroups(); } // Token: 0x06001973 RID: 6515 RVA: 0x00056BF8 File Offset: 0x00054DF8 private static int ReadInt(byte[] code, int pc) { int num = (int)code[pc]; num |= (int)code[pc + 1] << 8; num |= (int)code[pc + 2] << 16; return num | ((int)code[pc + 3] << 24); } // Token: 0x06001974 RID: 6516 RVA: 0x00056C2C File Offset: 0x00054E2C public override Match Scan(Regex regex, string text, int start, int end) { this.str = text; this.string_start = start; this.string_end = end; int num = 0; bool flag; if (this.eval_del != null) { flag = this.eval_del(this, start, ref num); } else { flag = this.EvalByteCode(11, start, ref num); } this.marks[this.groups[0]].End = num; if (flag) { return this.GenerateMatch(regex); } return Match.Empty; } // Token: 0x06001975 RID: 6517 RVA: 0x00056CAC File Offset: 0x00054EAC private void Open(int gid, int ptr) { int num = this.groups[gid]; if (num < this.mark_start || this.marks[num].IsDefined) { num = this.CreateMark(num); this.groups[gid] = num; } this.marks[num].Start = ptr; } // Token: 0x06001976 RID: 6518 RVA: 0x00056D08 File Offset: 0x00054F08 private void Close(int gid, int ptr) { this.marks[this.groups[gid]].End = ptr; } // Token: 0x06001977 RID: 6519 RVA: 0x00056D24 File Offset: 0x00054F24 private bool Balance(int gid, int balance_gid, bool capture, int ptr) { int num = this.groups[balance_gid]; if (num == -1 || this.marks[num].Index < 0) { return false; } if (gid > 0 && capture) { this.Open(gid, this.marks[num].Index + this.marks[num].Length); this.Close(gid, ptr); } this.groups[balance_gid] = this.marks[num].Previous; return true; } // Token: 0x06001978 RID: 6520 RVA: 0x00056DB4 File Offset: 0x00054FB4 private int Checkpoint() { this.mark_start = this.mark_end; return this.mark_start; } // Token: 0x06001979 RID: 6521 RVA: 0x00056DC8 File Offset: 0x00054FC8 private void Backtrack(int cp) { for (int i = 0; i < this.groups.Length; i++) { int num = this.groups[i]; while (cp <= num) { num = this.marks[num].Previous; } this.groups[i] = num; } } // Token: 0x0600197A RID: 6522 RVA: 0x00056E20 File Offset: 0x00055020 private void ResetGroups() { int num = this.groups.Length; if (this.marks == null) { this.marks = new Mark[num]; } for (int i = 0; i < num; i++) { this.groups[i] = i; this.marks[i].Start = -1; this.marks[i].End = -1; this.marks[i].Previous = -1; } this.mark_start = 0; this.mark_end = num; } // Token: 0x0600197B RID: 6523 RVA: 0x00056EAC File Offset: 0x000550AC private int GetLastDefined(int gid) { int num = this.groups[gid]; while (num >= 0 && !this.marks[num].IsDefined) { num = this.marks[num].Previous; } return num; } // Token: 0x0600197C RID: 6524 RVA: 0x00056EF8 File Offset: 0x000550F8 private int CreateMark(int previous) { if (this.mark_end == this.marks.Length) { Mark[] array = new Mark[this.marks.Length * 2]; this.marks.CopyTo(array, 0); this.marks = array; } int num = this.mark_end++; this.marks[num].Start = (this.marks[num].End = -1); this.marks[num].Previous = previous; return num; } // Token: 0x0600197D RID: 6525 RVA: 0x00056F88 File Offset: 0x00055188 private void GetGroupInfo(int gid, out int first_mark_index, out int n_caps) { first_mark_index = -1; n_caps = 0; for (int i = this.groups[gid]; i >= 0; i = this.marks[i].Previous) { if (this.marks[i].IsDefined) { if (first_mark_index < 0) { first_mark_index = i; } n_caps++; } } } // Token: 0x0600197E RID: 6526 RVA: 0x00056FF0 File Offset: 0x000551F0 private void PopulateGroup(Group g, int first_mark_index, int n_caps) { int num = 1; for (int i = this.marks[first_mark_index].Previous; i >= 0; i = this.marks[i].Previous) { if (this.marks[i].IsDefined) { Capture capture = new Capture(this.str, this.marks[i].Index, this.marks[i].Length); g.Captures.SetValue(capture, n_caps - 1 - num); num++; } } } // Token: 0x0600197F RID: 6527 RVA: 0x00057090 File Offset: 0x00055290 private Match GenerateMatch(Regex regex) { int num; int num2; this.GetGroupInfo(0, out num, out num2); if (!this.needs_groups_or_captures) { return new Match(regex, this, this.str, this.string_end, 0, this.marks[num].Index, this.marks[num].Length); } Match match = new Match(regex, this, this.str, this.string_end, this.groups.Length, this.marks[num].Index, this.marks[num].Length, num2); this.PopulateGroup(match, num, num2); for (int i = 1; i < this.groups.Length; i++) { this.GetGroupInfo(i, out num, out num2); Group group; if (num < 0) { group = Group.Fail; } else { group = new Group(this.str, this.marks[num].Index, this.marks[num].Length, num2); this.PopulateGroup(group, num, num2); } match.Groups.SetValue(group, i); } return match; } // Token: 0x06001980 RID: 6528 RVA: 0x000571B4 File Offset: 0x000553B4 internal void SetStartOfMatch(int pos) { this.marks[this.groups[0]].Start = pos; } // Token: 0x06001981 RID: 6529 RVA: 0x000571D0 File Offset: 0x000553D0 private static bool IsWordChar(char c) { return char.IsLetterOrDigit(c) || char.GetUnicodeCategory(c) == UnicodeCategory.ConnectorPunctuation; } // Token: 0x06001982 RID: 6530 RVA: 0x000571EC File Offset: 0x000553EC private bool EvalByteCode(int pc, int strpos, ref int strpos_result) { int num = 0; int i; int j; int num2; int num33; for (;;) { if (RxInterpreter.trace_rx) { Console.WriteLine("evaluating: {0} at pc: {1}, strpos: {2}, cge: {3}", new object[] { (RxOp)this.program[pc], pc, strpos, num }); } switch (this.program[pc]) { case 1: return false; case 2: if (num != 0) { pc = num; num = 0; continue; } goto IL_2DF; case 3: pc++; continue; case 4: if (strpos != 0) { return false; } pc++; continue; case 5: if (strpos == 0 || this.str[strpos - 1] == '\n') { pc++; continue; } return false; case 6: if (strpos != this.string_start) { return false; } pc++; continue; case 7: if (strpos != this.string_end) { return false; } pc++; continue; case 8: if (strpos == this.string_end || this.str[strpos] == '\n') { pc++; continue; } return false; case 9: if (strpos == this.string_end || (strpos == this.string_end - 1 && this.str[strpos] == '\n')) { pc++; continue; } return false; case 10: if (this.string_end == 0) { return false; } if (strpos == 0) { if (RxInterpreter.IsWordChar(this.str[strpos])) { pc++; continue; } return false; } else if (strpos == this.string_end) { if (RxInterpreter.IsWordChar(this.str[strpos - 1])) { pc++; continue; } return false; } else { if (RxInterpreter.IsWordChar(this.str[strpos]) != RxInterpreter.IsWordChar(this.str[strpos - 1])) { pc++; continue; } return false; } break; case 11: if (this.string_end == 0) { return false; } if (strpos == 0) { if (!RxInterpreter.IsWordChar(this.str[strpos])) { pc++; continue; } return false; } else if (strpos == this.string_end) { if (!RxInterpreter.IsWordChar(this.str[strpos - 1])) { pc++; continue; } return false; } else { if (RxInterpreter.IsWordChar(this.str[strpos]) == RxInterpreter.IsWordChar(this.str[strpos - 1])) { pc++; continue; } return false; } break; case 12: i = pc + 2; j = (int)this.program[pc + 1]; if (strpos + j > this.string_end) { return false; } num2 = i + j; while (i < num2) { if (this.str[strpos] != (char)this.program[i]) { return false; } strpos++; i++; } pc = num2; continue; case 13: i = pc + 2; j = (int)this.program[pc + 1]; if (strpos + j > this.string_end) { return false; } num2 = i + j; while (i < num2) { if (this.str[strpos] != (char)this.program[i] && char.ToLower(this.str[strpos]) != (char)this.program[i]) { return false; } strpos++; i++; } pc = num2; continue; case 14: { i = pc + 2; j = (int)this.program[pc + 1]; if (strpos < j) { return false; } int num3 = strpos - j; num2 = i + j; while (i < num2) { if (this.str[num3] != (char)this.program[i]) { return false; } i++; num3++; } strpos -= j; pc = num2; continue; } case 15: { i = pc + 2; j = (int)this.program[pc + 1]; if (strpos < j) { return false; } int num4 = strpos - j; num2 = i + j; while (i < num2) { if (this.str[num4] != (char)this.program[i] && char.ToLower(this.str[num4]) != (char)this.program[i]) { return false; } i++; num4++; } strpos -= j; pc = num2; continue; } case 16: i = pc + 3; j = (int)this.program[pc + 1] | ((int)this.program[pc + 2] << 8); if (strpos + j > this.string_end) { return false; } num2 = i + j * 2; while (i < num2) { int num5 = (int)this.program[i] | ((int)this.program[i + 1] << 8); if ((int)this.str[strpos] != num5) { return false; } strpos++; i += 2; } pc = num2; continue; case 17: i = pc + 3; j = (int)this.program[pc + 1] | ((int)this.program[pc + 2] << 8); if (strpos + j > this.string_end) { return false; } num2 = i + j * 2; while (i < num2) { int num6 = (int)this.program[i] | ((int)this.program[i + 1] << 8); if ((int)this.str[strpos] != num6 && (int)char.ToLower(this.str[strpos]) != num6) { return false; } strpos++; i += 2; } pc = num2; continue; case 18: { i = pc + 3; j = (int)this.program[pc + 1] | ((int)this.program[pc + 2] << 8); if (strpos < j) { return false; } int num7 = strpos - j; num2 = i + j * 2; while (i < num2) { int num8 = (int)this.program[i] | ((int)this.program[i + 1] << 8); if ((int)this.str[num7] != num8) { return false; } i += 2; num7 += 2; } strpos -= j; pc = num2; continue; } case 19: { i = pc + 3; j = (int)this.program[pc + 1] | ((int)this.program[pc + 2] << 8); if (strpos < j) { return false; } int num9 = strpos - j; num2 = i + j * 2; while (i < num2) { int num10 = (int)this.program[i] | ((int)this.program[i + 1] << 8); if ((int)this.str[num9] != num10 && (int)char.ToLower(this.str[num9]) != num10) { return false; } i += 2; num9 += 2; } strpos -= j; pc = num2; continue; } case 20: if (strpos < this.string_end) { char c = this.str[strpos]; if (c == (char)this.program[pc + 1]) { strpos++; if (num != 0) { goto IL_3E1B; } pc += 2; continue; } } if (num == 0) { return false; } pc += 2; continue; case 21: { if (strpos >= this.string_end) { return false; } char c2 = this.str[strpos]; if (c2 != (char)this.program[pc + 1]) { pc += 2; if (num == 0 || pc + 1 == num) { strpos++; if (pc + 1 == num) { goto IL_3E1B; } } continue; } return false; } case 22: if (strpos < this.string_end) { char c3 = char.ToLower(this.str[strpos]); if (c3 == (char)this.program[pc + 1]) { strpos++; if (num != 0) { goto IL_3E1B; } pc += 2; continue; } } if (num == 0) { return false; } pc += 2; continue; case 23: { if (strpos >= this.string_end) { return false; } char c4 = char.ToLower(this.str[strpos]); if (c4 != (char)this.program[pc + 1]) { pc += 2; if (num == 0 || pc + 1 == num) { strpos++; if (pc + 1 == num) { goto IL_3E1B; } } continue; } return false; } case 24: if (strpos > 0) { char c5 = this.str[strpos - 1]; if (c5 == (char)this.program[pc + 1]) { strpos--; if (num != 0) { goto IL_3E1B; } pc += 2; continue; } } if (num == 0) { return false; } pc += 2; continue; case 25: { if (strpos <= 0) { return false; } char c6 = this.str[strpos - 1]; if (c6 != (char)this.program[pc + 1]) { pc += 2; if (num == 0 || pc + 1 == num) { strpos--; if (pc + 1 == num) { goto IL_3E1B; } } continue; } return false; } case 26: if (strpos > 0) { char c7 = char.ToLower(this.str[strpos - 1]); if (c7 == (char)this.program[pc + 1]) { strpos--; if (num != 0) { goto IL_3E1B; } pc += 2; continue; } } if (num == 0) { return false; } pc += 2; continue; case 27: { if (strpos <= 0) { return false; } char c8 = char.ToLower(this.str[strpos - 1]); if (c8 != (char)this.program[pc + 1]) { pc += 2; if (num == 0 || pc + 1 == num) { strpos--; if (pc + 1 == num) { goto IL_3E1B; } } continue; } return false; } case 28: if (strpos < this.string_end) { char c9 = this.str[strpos]; if (c9 >= (char)this.program[pc + 1] && c9 <= (char)this.program[pc + 2]) { strpos++; if (num != 0) { goto IL_3E1B; } pc += 3; continue; } } if (num == 0) { return false; } pc += 3; continue; case 29: { if (strpos >= this.string_end) { return false; } char c10 = this.str[strpos]; if (c10 < (char)this.program[pc + 1] || c10 > (char)this.program[pc + 2]) { pc += 3; if (num == 0 || pc + 1 == num) { strpos++; if (pc + 1 == num) { goto IL_3E1B; } } continue; } return false; } case 30: if (strpos < this.string_end) { char c11 = char.ToLower(this.str[strpos]); if (c11 >= (char)this.program[pc + 1] && c11 <= (char)this.program[pc + 2]) { strpos++; if (num != 0) { goto IL_3E1B; } pc += 3; continue; } } if (num == 0) { return false; } pc += 3; continue; case 31: { if (strpos >= this.string_end) { return false; } char c12 = char.ToLower(this.str[strpos]); if (c12 < (char)this.program[pc + 1] || c12 > (char)this.program[pc + 2]) { pc += 3; if (num == 0 || pc + 1 == num) { strpos++; if (pc + 1 == num) { goto IL_3E1B; } } continue; } return false; } case 32: if (strpos > 0) { char c13 = this.str[strpos - 1]; if (c13 >= (char)this.program[pc + 1] && c13 <= (char)this.program[pc + 2]) { strpos--; if (num != 0) { goto IL_3E1B; } pc += 3; continue; } } if (num == 0) { return false; } pc += 3; continue; case 33: { if (strpos <= 0) { return false; } char c14 = this.str[strpos - 1]; if (c14 < (char)this.program[pc + 1] || c14 > (char)this.program[pc + 2]) { pc += 3; if (num == 0 || pc + 1 == num) { strpos--; if (pc + 1 == num) { goto IL_3E1B; } } continue; } return false; } case 34: if (strpos > 0) { char c15 = char.ToLower(this.str[strpos - 1]); if (c15 >= (char)this.program[pc + 1] && c15 <= (char)this.program[pc + 2]) { strpos--; if (num != 0) { goto IL_3E1B; } pc += 3; continue; } } if (num == 0) { return false; } pc += 3; continue; case 35: { if (strpos <= 0) { return false; } char c16 = char.ToLower(this.str[strpos - 1]); if (c16 < (char)this.program[pc + 1] || c16 > (char)this.program[pc + 2]) { pc += 3; if (num == 0 || pc + 1 == num) { strpos--; if (pc + 1 == num) { goto IL_3E1B; } } continue; } return false; } case 36: if (strpos < this.string_end) { char c17 = this.str[strpos]; int num11 = (int)c17; num11 -= (int)this.program[pc + 1]; j = (int)this.program[pc + 2]; if (num11 >= 0 && num11 < j << 3 && ((int)this.program[pc + 3 + (num11 >> 3)] & (1 << (num11 & 7))) != 0) { strpos++; if (num != 0) { goto IL_3E1B; } pc += (int)(3 + this.program[pc + 2]); continue; } } if (num == 0) { return false; } pc += (int)(3 + this.program[pc + 2]); continue; case 37: { if (strpos >= this.string_end) { return false; } char c18 = this.str[strpos]; int num12 = (int)c18; num12 -= (int)this.program[pc + 1]; j = (int)this.program[pc + 2]; if (num12 < 0 || num12 >= j << 3 || ((int)this.program[pc + 3 + (num12 >> 3)] & (1 << (num12 & 7))) == 0) { pc += (int)(3 + this.program[pc + 2]); if (num == 0 || pc + 1 == num) { strpos++; if (pc + 1 == num) { goto IL_3E1B; } } continue; } return false; } case 38: if (strpos < this.string_end) { char c19 = char.ToLower(this.str[strpos]); int num13 = (int)c19; num13 -= (int)this.program[pc + 1]; j = (int)this.program[pc + 2]; if (num13 >= 0 && num13 < j << 3 && ((int)this.program[pc + 3 + (num13 >> 3)] & (1 << (num13 & 7))) != 0) { strpos++; if (num != 0) { goto IL_3E1B; } pc += (int)(3 + this.program[pc + 2]); continue; } } if (num == 0) { return false; } pc += (int)(3 + this.program[pc + 2]); continue; case 39: { if (strpos >= this.string_end) { return false; } char c20 = char.ToLower(this.str[strpos]); int num14 = (int)c20; num14 -= (int)this.program[pc + 1]; j = (int)this.program[pc + 2]; if (num14 < 0 || num14 >= j << 3 || ((int)this.program[pc + 3 + (num14 >> 3)] & (1 << (num14 & 7))) == 0) { pc += (int)(3 + this.program[pc + 2]); if (num == 0 || pc + 1 == num) { strpos++; if (pc + 1 == num) { goto IL_3E1B; } } continue; } return false; } case 40: if (strpos > 0) { char c21 = this.str[strpos - 1]; int num15 = (int)c21; num15 -= (int)this.program[pc + 1]; j = (int)this.program[pc + 2]; if (num15 >= 0 && num15 < j << 3 && ((int)this.program[pc + 3 + (num15 >> 3)] & (1 << (num15 & 7))) != 0) { strpos--; if (num != 0) { goto IL_3E1B; } pc += (int)(3 + this.program[pc + 2]); continue; } } if (num == 0) { return false; } pc += (int)(3 + this.program[pc + 2]); continue; case 41: { if (strpos <= 0) { return false; } char c22 = this.str[strpos - 1]; int num16 = (int)c22; num16 -= (int)this.program[pc + 1]; j = (int)this.program[pc + 2]; if (num16 < 0 || num16 >= j << 3 || ((int)this.program[pc + 3 + (num16 >> 3)] & (1 << (num16 & 7))) == 0) { pc += (int)(3 + this.program[pc + 2]); if (num == 0 || pc + 1 == num) { strpos--; if (pc + 1 == num) { goto IL_3E1B; } } continue; } return false; } case 42: if (strpos > 0) { char c23 = char.ToLower(this.str[strpos - 1]); int num17 = (int)c23; num17 -= (int)this.program[pc + 1]; j = (int)this.program[pc + 2]; if (num17 >= 0 && num17 < j << 3 && ((int)this.program[pc + 3 + (num17 >> 3)] & (1 << (num17 & 7))) != 0) { strpos--; if (num != 0) { goto IL_3E1B; } pc += (int)(3 + this.program[pc + 2]); continue; } } if (num == 0) { return false; } pc += (int)(3 + this.program[pc + 2]); continue; case 43: { if (strpos <= 0) { return false; } char c24 = char.ToLower(this.str[strpos - 1]); int num18 = (int)c24; num18 -= (int)this.program[pc + 1]; j = (int)this.program[pc + 2]; if (num18 < 0 || num18 >= j << 3 || ((int)this.program[pc + 3 + (num18 >> 3)] & (1 << (num18 & 7))) == 0) { pc += (int)(3 + this.program[pc + 2]); if (num == 0 || pc + 1 == num) { strpos--; if (pc + 1 == num) { goto IL_3E1B; } } continue; } return false; } case 44: if (strpos < this.string_end) { char c25 = this.str[strpos]; if ((int)c25 == ((int)this.program[pc + 1] | ((int)this.program[pc + 2] << 8))) { strpos++; if (num != 0) { goto IL_3E1B; } pc += 3; continue; } } if (num == 0) { return false; } pc += 3; continue; case 45: { if (strpos >= this.string_end) { return false; } char c26 = this.str[strpos]; if ((int)c26 != ((int)this.program[pc + 1] | ((int)this.program[pc + 2] << 8))) { pc += 3; if (num == 0 || pc + 1 == num) { strpos++; if (pc + 1 == num) { goto IL_3E1B; } } continue; } return false; } case 46: if (strpos < this.string_end) { char c27 = char.ToLower(this.str[strpos]); if ((int)c27 == ((int)this.program[pc + 1] | ((int)this.program[pc + 2] << 8))) { strpos++; if (num != 0) { goto IL_3E1B; } pc += 3; continue; } } if (num == 0) { return false; } pc += 3; continue; case 47: { if (strpos >= this.string_end) { return false; } char c28 = char.ToLower(this.str[strpos]); if ((int)c28 != ((int)this.program[pc + 1] | ((int)this.program[pc + 2] << 8))) { pc += 3; if (num == 0 || pc + 1 == num) { strpos++; if (pc + 1 == num) { goto IL_3E1B; } } continue; } return false; } case 48: if (strpos > 0) { char c29 = this.str[strpos - 1]; if ((int)c29 == ((int)this.program[pc + 1] | ((int)this.program[pc + 2] << 8))) { strpos--; if (num != 0) { goto IL_3E1B; } pc += 3; continue; } } if (num == 0) { return false; } pc += 3; continue; case 49: { if (strpos <= 0) { return false; } char c30 = this.str[strpos - 1]; if ((int)c30 != ((int)this.program[pc + 1] | ((int)this.program[pc + 2] << 8))) { pc += 3; if (num == 0 || pc + 1 == num) { strpos--; if (pc + 1 == num) { goto IL_3E1B; } } continue; } return false; } case 50: if (strpos > 0) { char c31 = char.ToLower(this.str[strpos - 1]); if ((int)c31 == ((int)this.program[pc + 1] | ((int)this.program[pc + 2] << 8))) { strpos--; if (num != 0) { goto IL_3E1B; } pc += 3; continue; } } if (num == 0) { return false; } pc += 3; continue; case 51: { if (strpos <= 0) { return false; } char c32 = char.ToLower(this.str[strpos - 1]); if ((int)c32 != ((int)this.program[pc + 1] | ((int)this.program[pc + 2] << 8))) { pc += 3; if (num == 0 || pc + 1 == num) { strpos--; if (pc + 1 == num) { goto IL_3E1B; } } continue; } return false; } case 52: if (strpos < this.string_end) { char c33 = this.str[strpos]; if ((int)c33 >= ((int)this.program[pc + 1] | ((int)this.program[pc + 2] << 8)) && (int)c33 <= ((int)this.program[pc + 3] | ((int)this.program[pc + 4] << 8))) { strpos++; if (num != 0) { goto IL_3E1B; } pc += 5; continue; } } if (num == 0) { return false; } pc += 5; continue; case 53: { if (strpos >= this.string_end) { return false; } char c34 = this.str[strpos]; if ((int)c34 < ((int)this.program[pc + 1] | ((int)this.program[pc + 2] << 8)) || (int)c34 > ((int)this.program[pc + 3] | ((int)this.program[pc + 4] << 8))) { pc += 5; if (num == 0 || pc + 1 == num) { strpos++; if (pc + 1 == num) { goto IL_3E1B; } } continue; } return false; } case 54: if (strpos < this.string_end) { char c35 = char.ToLower(this.str[strpos]); if ((int)c35 >= ((int)this.program[pc + 1] | ((int)this.program[pc + 2] << 8)) && (int)c35 <= ((int)this.program[pc + 3] | ((int)this.program[pc + 4] << 8))) { strpos++; if (num != 0) { goto IL_3E1B; } pc += 5; continue; } } if (num == 0) { return false; } pc += 5; continue; case 55: { if (strpos >= this.string_end) { return false; } char c36 = char.ToLower(this.str[strpos]); if ((int)c36 < ((int)this.program[pc + 1] | ((int)this.program[pc + 2] << 8)) || (int)c36 > ((int)this.program[pc + 3] | ((int)this.program[pc + 4] << 8))) { pc += 5; if (num == 0 || pc + 1 == num) { strpos++; if (pc + 1 == num) { goto IL_3E1B; } } continue; } return false; } case 56: if (strpos > 0) { char c37 = this.str[strpos - 1]; if ((int)c37 >= ((int)this.program[pc + 1] | ((int)this.program[pc + 2] << 8)) && (int)c37 <= ((int)this.program[pc + 3] | ((int)this.program[pc + 4] << 8))) { strpos--; if (num != 0) { goto IL_3E1B; } pc += 5; continue; } } if (num == 0) { return false; } pc += 5; continue; case 57: { if (strpos <= 0) { return false; } char c38 = this.str[strpos - 1]; if ((int)c38 < ((int)this.program[pc + 1] | ((int)this.program[pc + 2] << 8)) || (int)c38 > ((int)this.program[pc + 3] | ((int)this.program[pc + 4] << 8))) { pc += 5; if (num == 0 || pc + 1 == num) { strpos--; if (pc + 1 == num) { goto IL_3E1B; } } continue; } return false; } case 58: if (strpos > 0) { char c39 = char.ToLower(this.str[strpos - 1]); if ((int)c39 >= ((int)this.program[pc + 1] | ((int)this.program[pc + 2] << 8)) && (int)c39 <= ((int)this.program[pc + 3] | ((int)this.program[pc + 4] << 8))) { strpos--; if (num != 0) { goto IL_3E1B; } pc += 5; continue; } } if (num == 0) { return false; } pc += 5; continue; case 59: { if (strpos <= 0) { return false; } char c40 = char.ToLower(this.str[strpos - 1]); if ((int)c40 < ((int)this.program[pc + 1] | ((int)this.program[pc + 2] << 8)) || (int)c40 > ((int)this.program[pc + 3] | ((int)this.program[pc + 4] << 8))) { pc += 5; if (num == 0 || pc + 1 == num) { strpos--; if (pc + 1 == num) { goto IL_3E1B; } } continue; } return false; } case 60: if (strpos < this.string_end) { char c41 = this.str[strpos]; int num19 = (int)c41; num19 -= (int)this.program[pc + 1] | ((int)this.program[pc + 2] << 8); j = (int)this.program[pc + 3] | ((int)this.program[pc + 4] << 8); if (num19 >= 0 && num19 < j << 3 && ((int)this.program[pc + 5 + (num19 >> 3)] & (1 << (num19 & 7))) != 0) { strpos++; if (num != 0) { goto IL_3E1B; } pc += 5 + ((int)this.program[pc + 3] | ((int)this.program[pc + 4] << 8)); continue; } } if (num == 0) { return false; } pc += 5 + ((int)this.program[pc + 3] | ((int)this.program[pc + 4] << 8)); continue; case 61: { if (strpos >= this.string_end) { return false; } char c42 = this.str[strpos]; int num20 = (int)c42; num20 -= (int)this.program[pc + 1] | ((int)this.program[pc + 2] << 8); j = (int)this.program[pc + 3] | ((int)this.program[pc + 4] << 8); if (num20 < 0 || num20 >= j << 3 || ((int)this.program[pc + 5 + (num20 >> 3)] & (1 << (num20 & 7))) == 0) { pc += 5 + ((int)this.program[pc + 3] | ((int)this.program[pc + 4] << 8)); if (num == 0 || pc + 1 == num) { strpos++; if (pc + 1 == num) { goto IL_3E1B; } } continue; } return false; } case 62: if (strpos < this.string_end) { char c43 = char.ToLower(this.str[strpos]); int num21 = (int)c43; num21 -= (int)this.program[pc + 1] | ((int)this.program[pc + 2] << 8); j = (int)this.program[pc + 3] | ((int)this.program[pc + 4] << 8); if (num21 >= 0 && num21 < j << 3 && ((int)this.program[pc + 5 + (num21 >> 3)] & (1 << (num21 & 7))) != 0) { strpos++; if (num != 0) { goto IL_3E1B; } pc += 5 + ((int)this.program[pc + 3] | ((int)this.program[pc + 4] << 8)); continue; } } if (num == 0) { return false; } pc += 5 + ((int)this.program[pc + 3] | ((int)this.program[pc + 4] << 8)); continue; case 63: { if (strpos >= this.string_end) { return false; } char c44 = char.ToLower(this.str[strpos]); int num22 = (int)c44; num22 -= (int)this.program[pc + 1] | ((int)this.program[pc + 2] << 8); j = (int)this.program[pc + 3] | ((int)this.program[pc + 4] << 8); if (num22 < 0 || num22 >= j << 3 || ((int)this.program[pc + 5 + (num22 >> 3)] & (1 << (num22 & 7))) == 0) { pc += 5 + ((int)this.program[pc + 3] | ((int)this.program[pc + 4] << 8)); if (num == 0 || pc + 1 == num) { strpos++; if (pc + 1 == num) { goto IL_3E1B; } } continue; } return false; } case 64: if (strpos > 0) { char c45 = this.str[strpos - 1]; int num23 = (int)c45; num23 -= (int)this.program[pc + 1] | ((int)this.program[pc + 2] << 8); j = (int)this.program[pc + 3] | ((int)this.program[pc + 4] << 8); if (num23 >= 0 && num23 < j << 3 && ((int)this.program[pc + 5 + (num23 >> 3)] & (1 << (num23 & 7))) != 0) { strpos--; if (num != 0) { goto IL_3E1B; } pc += 5 + ((int)this.program[pc + 3] | ((int)this.program[pc + 4] << 8)); continue; } } if (num == 0) { return false; } pc += 5 + ((int)this.program[pc + 3] | ((int)this.program[pc + 4] << 8)); continue; case 65: { if (strpos <= 0) { return false; } char c46 = this.str[strpos - 1]; int num24 = (int)c46; num24 -= (int)this.program[pc + 1] | ((int)this.program[pc + 2] << 8); j = (int)this.program[pc + 3] | ((int)this.program[pc + 4] << 8); if (num24 < 0 || num24 >= j << 3 || ((int)this.program[pc + 5 + (num24 >> 3)] & (1 << (num24 & 7))) == 0) { pc += 5 + ((int)this.program[pc + 3] | ((int)this.program[pc + 4] << 8)); if (num == 0 || pc + 1 == num) { strpos--; if (pc + 1 == num) { goto IL_3E1B; } } continue; } return false; } case 66: if (strpos > 0) { char c47 = char.ToLower(this.str[strpos - 1]); int num25 = (int)c47; num25 -= (int)this.program[pc + 1] | ((int)this.program[pc + 2] << 8); j = (int)this.program[pc + 3] | ((int)this.program[pc + 4] << 8); if (num25 >= 0 && num25 < j << 3 && ((int)this.program[pc + 5 + (num25 >> 3)] & (1 << (num25 & 7))) != 0) { strpos--; if (num != 0) { goto IL_3E1B; } pc += 5 + ((int)this.program[pc + 3] | ((int)this.program[pc + 4] << 8)); continue; } } if (num == 0) { return false; } pc += 5 + ((int)this.program[pc + 3] | ((int)this.program[pc + 4] << 8)); continue; case 67: { if (strpos <= 0) { return false; } char c48 = char.ToLower(this.str[strpos - 1]); int num26 = (int)c48; num26 -= (int)this.program[pc + 1] | ((int)this.program[pc + 2] << 8); j = (int)this.program[pc + 3] | ((int)this.program[pc + 4] << 8); if (num26 < 0 || num26 >= j << 3 || ((int)this.program[pc + 5 + (num26 >> 3)] & (1 << (num26 & 7))) == 0) { pc += 5 + ((int)this.program[pc + 3] | ((int)this.program[pc + 4] << 8)); if (num == 0 || pc + 1 == num) { strpos--; if (pc + 1 == num) { goto IL_3E1B; } } continue; } return false; } case 68: if (strpos < this.string_end) { char c49 = this.str[strpos]; if (c49 != '\n') { strpos++; if (num != 0) { goto IL_3E1B; } pc++; continue; } } if (num == 0) { return false; } pc++; continue; case 69: { if (strpos >= this.string_end) { return false; } char c50 = this.str[strpos]; if (c50 == '\n') { pc++; if (num == 0 || pc + 1 == num) { strpos++; if (pc + 1 == num) { goto IL_3E1B; } } continue; } return false; } case 70: if (strpos > 0) { char c51 = this.str[strpos - 1]; if (c51 != '\n') { strpos--; if (num != 0) { goto IL_3E1B; } pc++; continue; } } if (num == 0) { return false; } pc++; continue; case 71: { if (strpos <= 0) { return false; } char c52 = this.str[strpos - 1]; if (c52 == '\n') { pc++; if (num == 0 || pc + 1 == num) { strpos--; if (pc + 1 == num) { goto IL_3E1B; } } continue; } return false; } case 72: if (strpos < this.string_end) { char c53 = this.str[strpos]; strpos++; if (num != 0) { goto IL_3E1B; } pc++; continue; } else { if (num == 0) { return false; } pc++; continue; } break; case 73: goto IL_1C0E; case 74: if (strpos > 0) { char c54 = this.str[strpos - 1]; strpos--; if (num != 0) { goto IL_3E1B; } pc++; continue; } else { if (num == 0) { return false; } pc++; continue; } break; case 75: goto IL_2FF7; case 76: if (strpos < this.string_end) { char c55 = this.str[strpos]; if (char.IsDigit(c55)) { strpos++; if (num != 0) { goto IL_3E1B; } pc++; continue; } } if (num == 0) { return false; } pc++; continue; case 77: { if (strpos >= this.string_end) { return false; } char c56 = this.str[strpos]; if (!char.IsDigit(c56)) { pc++; if (num == 0 || pc + 1 == num) { strpos++; if (pc + 1 == num) { goto IL_3E1B; } } continue; } return false; } case 78: if (strpos > 0) { char c57 = this.str[strpos - 1]; if (char.IsDigit(c57)) { strpos--; if (num != 0) { goto IL_3E1B; } pc++; continue; } } if (num == 0) { return false; } pc++; continue; case 79: { if (strpos <= 0) { return false; } char c58 = this.str[strpos - 1]; if (!char.IsDigit(c58)) { pc++; if (num == 0 || pc + 1 == num) { strpos--; if (pc + 1 == num) { goto IL_3E1B; } } continue; } return false; } case 80: if (strpos < this.string_end) { char c59 = this.str[strpos]; if (char.IsLetterOrDigit(c59) || char.GetUnicodeCategory(c59) == UnicodeCategory.ConnectorPunctuation) { strpos++; if (num != 0) { goto IL_3E1B; } pc++; continue; } } if (num == 0) { return false; } pc++; continue; case 81: { if (strpos >= this.string_end) { return false; } char c60 = this.str[strpos]; if (!char.IsLetterOrDigit(c60) && char.GetUnicodeCategory(c60) != UnicodeCategory.ConnectorPunctuation) { pc++; if (num == 0 || pc + 1 == num) { strpos++; if (pc + 1 == num) { goto IL_3E1B; } } continue; } return false; } case 82: if (strpos > 0) { char c61 = this.str[strpos - 1]; if (char.IsLetterOrDigit(c61) || char.GetUnicodeCategory(c61) == UnicodeCategory.ConnectorPunctuation) { strpos--; if (num != 0) { goto IL_3E1B; } pc++; continue; } } if (num == 0) { return false; } pc++; continue; case 83: { if (strpos <= 0) { return false; } char c62 = this.str[strpos - 1]; if (!char.IsLetterOrDigit(c62) && char.GetUnicodeCategory(c62) != UnicodeCategory.ConnectorPunctuation) { pc++; if (num == 0 || pc + 1 == num) { strpos--; if (pc + 1 == num) { goto IL_3E1B; } } continue; } return false; } case 84: if (strpos < this.string_end) { char c63 = this.str[strpos]; if (char.IsWhiteSpace(c63)) { strpos++; if (num != 0) { goto IL_3E1B; } pc++; continue; } } if (num == 0) { return false; } pc++; continue; case 85: { if (strpos >= this.string_end) { return false; } char c64 = this.str[strpos]; if (!char.IsWhiteSpace(c64)) { pc++; if (num == 0 || pc + 1 == num) { strpos++; if (pc + 1 == num) { goto IL_3E1B; } } continue; } return false; } case 86: if (strpos > 0) { char c65 = this.str[strpos - 1]; if (char.IsWhiteSpace(c65)) { strpos--; if (num != 0) { goto IL_3E1B; } pc++; continue; } } if (num == 0) { return false; } pc++; continue; case 87: { if (strpos <= 0) { return false; } char c66 = this.str[strpos - 1]; if (!char.IsWhiteSpace(c66)) { pc++; if (num == 0 || pc + 1 == num) { strpos--; if (pc + 1 == num) { goto IL_3E1B; } } continue; } return false; } case 88: if (strpos < this.string_end) { char c67 = this.str[strpos]; if (('a' <= c67 && c67 <= 'z') || ('A' <= c67 && c67 <= 'Z') || ('0' <= c67 && c67 <= '9') || c67 == '_') { strpos++; if (num != 0) { goto IL_3E1B; } pc++; continue; } } if (num == 0) { return false; } pc++; continue; case 89: { if (strpos >= this.string_end) { return false; } char c68 = this.str[strpos]; if (('a' > c68 || c68 > 'z') && ('A' > c68 || c68 > 'Z') && ('0' > c68 || c68 > '9') && c68 != '_') { pc++; if (num == 0 || pc + 1 == num) { strpos++; if (pc + 1 == num) { goto IL_3E1B; } } continue; } return false; } case 90: if (strpos > 0) { char c69 = this.str[strpos - 1]; if (('a' <= c69 && c69 <= 'z') || ('A' <= c69 && c69 <= 'Z') || ('0' <= c69 && c69 <= '9') || c69 == '_') { strpos--; if (num != 0) { goto IL_3E1B; } pc++; continue; } } if (num == 0) { return false; } pc++; continue; case 91: { if (strpos <= 0) { return false; } char c70 = this.str[strpos - 1]; if (('a' > c70 || c70 > 'z') && ('A' > c70 || c70 > 'Z') && ('0' > c70 || c70 > '9') && c70 != '_') { pc++; if (num == 0 || pc + 1 == num) { strpos--; if (pc + 1 == num) { goto IL_3E1B; } } continue; } return false; } case 92: if (strpos < this.string_end) { char c71 = this.str[strpos]; if (c71 == ' ' || c71 == '\t' || c71 == '\n' || c71 == '\r' || c71 == '\f' || c71 == '\v') { strpos++; if (num != 0) { goto IL_3E1B; } pc++; continue; } } if (num == 0) { return false; } pc++; continue; case 93: { if (strpos >= this.string_end) { return false; } char c72 = this.str[strpos]; if (c72 != ' ' && c72 != '\t' && c72 != '\n' && c72 != '\r' && c72 != '\f' && c72 != '\v') { pc++; if (num == 0 || pc + 1 == num) { strpos++; if (pc + 1 == num) { goto IL_3E1B; } } continue; } return false; } case 94: if (strpos > 0) { char c73 = this.str[strpos - 1]; if (c73 == ' ' || c73 == '\t' || c73 == '\n' || c73 == '\r' || c73 == '\f' || c73 == '\v') { strpos--; if (num != 0) { goto IL_3E1B; } pc++; continue; } } if (num == 0) { return false; } pc++; continue; case 95: { if (strpos <= 0) { return false; } char c74 = this.str[strpos - 1]; if (c74 != ' ' && c74 != '\t' && c74 != '\n' && c74 != '\r' && c74 != '\f' && c74 != '\v') { pc++; if (num == 0 || pc + 1 == num) { strpos--; if (pc + 1 == num) { goto IL_3E1B; } } continue; } return false; } case 96: if (strpos < this.string_end) { char c75 = this.str[strpos]; if (char.GetUnicodeCategory(c75) == (UnicodeCategory)this.program[pc + 1]) { strpos++; if (num != 0) { goto IL_3E1B; } pc += 2; continue; } } if (num == 0) { return false; } pc += 2; continue; case 97: { if (strpos >= this.string_end) { return false; } char c76 = this.str[strpos]; if (char.GetUnicodeCategory(c76) != (UnicodeCategory)this.program[pc + 1]) { pc += 2; if (num == 0 || pc + 1 == num) { strpos++; if (pc + 1 == num) { goto IL_3E1B; } } continue; } return false; } case 98: if (strpos > 0) { char c77 = this.str[strpos - 1]; if (char.GetUnicodeCategory(c77) == (UnicodeCategory)this.program[pc + 1]) { strpos--; if (num != 0) { goto IL_3E1B; } pc += 2; continue; } } if (num == 0) { return false; } pc += 2; continue; case 99: { if (strpos <= 0) { return false; } char c78 = this.str[strpos - 1]; if (char.GetUnicodeCategory(c78) != (UnicodeCategory)this.program[pc + 1]) { pc += 2; if (num == 0 || pc + 1 == num) { strpos--; if (pc + 1 == num) { goto IL_3E1B; } } continue; } return false; } case 124: if (strpos < this.string_end) { char c79 = this.str[strpos]; if (('\ufeff' <= c79 && c79 <= '\ufeff') || ('\ufff0' <= c79 && c79 <= '\ufffd')) { strpos++; if (num != 0) { goto IL_3E1B; } pc++; continue; } } if (num == 0) { return false; } pc++; continue; case 125: { if (strpos >= this.string_end) { return false; } char c80 = this.str[strpos]; if (('\ufeff' > c80 || c80 > '\ufeff') && ('\ufff0' > c80 || c80 > '\ufffd')) { pc++; if (num == 0 || pc + 1 == num) { strpos++; if (pc + 1 == num) { goto IL_3E1B; } } continue; } return false; } case 126: if (strpos > 0) { char c81 = this.str[strpos - 1]; if (('\ufeff' <= c81 && c81 <= '\ufeff') || ('\ufff0' <= c81 && c81 <= '\ufffd')) { strpos--; if (num != 0) { goto IL_3E1B; } pc++; continue; } } if (num == 0) { return false; } pc++; continue; case 127: { if (strpos <= 0) { return false; } char c82 = this.str[strpos - 1]; if (('\ufeff' > c82 || c82 > '\ufeff') && ('\ufff0' > c82 || c82 > '\ufffd')) { pc++; if (num == 0 || pc + 1 == num) { strpos--; if (pc + 1 == num) { goto IL_3E1B; } } continue; } return false; } case 132: if (strpos < this.string_end) { char c83 = this.str[strpos]; if (CategoryUtils.IsCategory((Category)this.program[pc + 1], c83)) { strpos++; if (num != 0) { goto IL_3E1B; } pc += 2; continue; } } if (num == 0) { return false; } pc += 2; continue; case 133: { if (strpos >= this.string_end) { return false; } char c84 = this.str[strpos]; if (!CategoryUtils.IsCategory((Category)this.program[pc + 1], c84)) { pc += 2; if (num == 0 || pc + 1 == num) { strpos++; if (pc + 1 == num) { goto IL_3E1B; } } continue; } return false; } case 134: if (strpos > 0) { char c85 = this.str[strpos - 1]; if (CategoryUtils.IsCategory((Category)this.program[pc + 1], c85)) { strpos--; if (num != 0) { goto IL_3E1B; } pc += 2; continue; } } if (num == 0) { return false; } pc += 2; continue; case 135: { if (strpos <= 0) { return false; } char c86 = this.str[strpos - 1]; if (!CategoryUtils.IsCategory((Category)this.program[pc + 1], c86)) { pc += 2; if (num == 0 || pc + 1 == num) { strpos--; if (pc + 1 == num) { goto IL_3E1B; } } continue; } return false; } case 136: j = this.GetLastDefined((int)this.program[pc + 1] | ((int)this.program[pc + 2] << 8)); if (j < 0) { return false; } i = this.marks[j].Index; j = this.marks[j].Length; if (strpos + j > this.string_end) { return false; } num2 = i + j; while (i < num2) { if (this.str[strpos] != this.str[i]) { return false; } strpos++; i++; } pc += 3; continue; case 137: j = this.GetLastDefined((int)this.program[pc + 1] | ((int)this.program[pc + 2] << 8)); if (j < 0) { return false; } i = this.marks[j].Index; j = this.marks[j].Length; if (strpos + j > this.string_end) { return false; } num2 = i + j; while (i < num2) { if (this.str[strpos] != this.str[i] && char.ToLower(this.str[strpos]) != char.ToLower(this.str[i])) { return false; } strpos++; i++; } pc += 3; continue; case 138: { j = this.GetLastDefined((int)this.program[pc + 1] | ((int)this.program[pc + 2] << 8)); if (j < 0) { return false; } i = this.marks[j].Index; j = this.marks[j].Length; if (strpos - j < 0) { return false; } int num27 = strpos - j; num2 = i + j; while (i < num2) { if (this.str[num27] != this.str[i]) { return false; } i++; num27++; } strpos -= j; pc += 3; continue; } case 140: this.Open((int)this.program[pc + 1] | ((int)this.program[pc + 2] << 8), strpos); pc += 3; continue; case 141: this.Close((int)this.program[pc + 1] | ((int)this.program[pc + 2] << 8), strpos); pc += 3; continue; case 142: { int num28 = 0; if (!this.EvalByteCode(pc + 8, strpos, ref num28)) { goto Block_58; } int num29 = (int)this.program[pc + 1] | ((int)this.program[pc + 2] << 8); int num30 = (int)this.program[pc + 3] | ((int)this.program[pc + 4] << 8); bool flag = this.program[pc + 5] > 0; if (!this.Balance(num29, num30, flag, strpos)) { goto Block_59; } strpos = num28; pc += (int)this.program[pc + 6] | ((int)this.program[pc + 7] << 8); continue; } case 143: goto IL_BAD; case 144: if (this.GetLastDefined((int)this.program[pc + 3] | ((int)this.program[pc + 4] << 8)) >= 0) { pc += 5; } else { pc += (int)this.program[pc + 1] | ((int)this.program[pc + 2] << 8); } continue; case 145: pc += (int)this.program[pc + 1] | ((int)this.program[pc + 2] << 8); continue; case 146: { int num31 = 0; if (this.EvalByteCode(pc + 3, strpos, ref num31)) { pc += (int)this.program[pc + 1] | ((int)this.program[pc + 2] << 8); strpos = num31; continue; } return false; } case 147: { int num32 = 0; if (this.EvalByteCode(pc + 5, strpos, ref num32)) { pc += (int)this.program[pc + 1] | ((int)this.program[pc + 2] << 8); } else { pc += (int)this.program[pc + 3] | ((int)this.program[pc + 4] << 8); } continue; } case 148: num33 = 0; if (this.EvalByteCode(pc + 3, strpos, ref num33)) { goto Block_498; } pc += (int)this.program[pc + 1] | ((int)this.program[pc + 2] << 8); continue; case 149: num = pc + ((int)this.program[pc + 1] | ((int)this.program[pc + 2] << 8)); pc += 3; continue; case 150: goto IL_4FD; case 151: goto IL_71A; case 152: case 153: goto IL_37FA; case 154: goto IL_3884; case 155: case 156: goto IL_3C23; } break; IL_3E1B: pc = num; num = 0; } goto IL_3DE6; IL_2DF: strpos_result = strpos; return true; IL_4FD: int num34 = (int)this.program[pc + 1] | ((int)this.program[pc + 2] << 8); int num35 = (int)this.program[pc + 3] | ((int)this.program[pc + 4] << 8); int num36 = pc + 5; RxOp rxOp = (RxOp)(this.program[num36] & byte.MaxValue); bool flag2 = false; if ((rxOp == RxOp.String || rxOp == RxOp.StringIgnoreCase) && pc + num34 == num36 + 2 + (int)this.program[num36 + 1] + 1) { flag2 = true; if (RxInterpreter.trace_rx) { Console.WriteLine(" string anchor at {0}, offset {1}", num36, num35); } } pc += num34; if (this.program[pc] == 4) { if (strpos == 0) { int num37 = strpos; if (this.groups.Length > 1) { this.ResetGroups(); this.marks[this.groups[0]].Start = strpos; } if (this.EvalByteCode(pc + 1, strpos, ref num37)) { this.marks[this.groups[0]].Start = strpos; if (this.groups.Length > 1) { this.marks[this.groups[0]].End = num37; } strpos_result = num37; return true; } } return false; } num2 = this.string_end + 1; while (strpos < num2) { if (flag2 && (rxOp == RxOp.String || rxOp == RxOp.StringIgnoreCase)) { int num38 = strpos; if (!this.EvalByteCode(num36, strpos + num35, ref num38)) { strpos++; continue; } } int num39 = strpos; if (this.groups.Length > 1) { this.ResetGroups(); this.marks[this.groups[0]].Start = strpos; } if (this.EvalByteCode(pc, strpos, ref num39)) { this.marks[this.groups[0]].Start = strpos; if (this.groups.Length > 1) { this.marks[this.groups[0]].End = num39; } strpos_result = num39; return true; } strpos++; } return false; IL_71A: j = (int)this.program[pc + 3] | ((int)this.program[pc + 4] << 8); pc += (int)this.program[pc + 1] | ((int)this.program[pc + 2] << 8); while (strpos >= 0) { int num40 = strpos; if (this.groups.Length > 1) { this.ResetGroups(); this.marks[this.groups[0]].Start = strpos; } if (this.EvalByteCode(pc, strpos, ref num40)) { this.marks[this.groups[0]].Start = strpos; if (this.groups.Length > 1) { this.marks[this.groups[0]].End = num40; } strpos_result = num40; return true; } strpos--; } return false; Block_58: Block_59: return false; IL_BAD: goto IL_3E14; IL_1C0E: if (strpos < this.string_end) { char c87 = this.str[strpos]; } return false; IL_2FF7: if (strpos > 0) { char c88 = this.str[strpos - 1]; } return false; Block_498: strpos_result = num33; return true; IL_37FA: int num41 = 0; this.repeat = new RxInterpreter.RepeatContext(this.repeat, RxInterpreter.ReadInt(this.program, pc + 3), RxInterpreter.ReadInt(this.program, pc + 7), this.program[pc] == 153, pc + 11); int num42 = pc + ((int)this.program[pc + 1] | ((int)this.program[pc + 2] << 8)); if (!this.EvalByteCode(num42, strpos, ref num41)) { this.repeat = this.repeat.Previous; return false; } strpos = num41; strpos_result = strpos; return true; IL_3884: RxInterpreter.RepeatContext repeatContext = this.repeat; int num43 = 0; if (this.deep == repeatContext) { goto IL_3E14; } i = repeatContext.Start; int count = repeatContext.Count; while (!repeatContext.IsMinimum) { repeatContext.Count++; repeatContext.Start = strpos; this.deep = repeatContext; if (!this.EvalByteCode(repeatContext.Expression, strpos, ref num43)) { repeatContext.Start = i; repeatContext.Count = count; return false; } strpos = num43; if (this.deep != repeatContext) { goto IL_3E14; } } if (strpos == repeatContext.Start) { this.repeat = repeatContext.Previous; this.deep = null; if (this.EvalByteCode(pc + 1, strpos, ref num43)) { strpos = num43; goto IL_3E14; } this.repeat = repeatContext; return false; } else { if (repeatContext.IsLazy) { for (;;) { this.repeat = repeatContext.Previous; this.deep = null; int num44 = this.Checkpoint(); if (this.EvalByteCode(pc + 1, strpos, ref num43)) { break; } this.Backtrack(num44); this.repeat = repeatContext; if (repeatContext.IsMaximum) { goto Block_508; } repeatContext.Count++; repeatContext.Start = strpos; this.deep = repeatContext; if (!this.EvalByteCode(repeatContext.Expression, strpos, ref num43)) { goto Block_509; } strpos = num43; if (this.deep != repeatContext) { goto Block_510; } if (strpos == repeatContext.Start) { goto Block_511; } } strpos = num43; goto IL_3E14; Block_508: return false; Block_509: repeatContext.Start = i; repeatContext.Count = count; return false; Block_510: goto IL_3E14; Block_511: return false; } int count2 = this.stack.Count; while (!repeatContext.IsMaximum) { int num45 = this.Checkpoint(); int num46 = strpos; int start = repeatContext.Start; repeatContext.Count++; if (RxInterpreter.trace_rx) { Console.WriteLine("recurse with count {0}.", repeatContext.Count); } repeatContext.Start = strpos; this.deep = repeatContext; if (!this.EvalByteCode(repeatContext.Expression, strpos, ref num43)) { repeatContext.Count--; repeatContext.Start = start; this.Backtrack(num45); break; } strpos = num43; if (this.deep != repeatContext) { this.stack.Count = count2; goto IL_3E14; } this.stack.Push(num45); this.stack.Push(num46); if (strpos == repeatContext.Start) { break; } } if (RxInterpreter.trace_rx) { Console.WriteLine("matching tail: {0} pc={1}", strpos, pc + 1); } this.repeat = repeatContext.Previous; for (;;) { this.deep = null; if (this.EvalByteCode(pc + 1, strpos, ref num43)) { break; } if (this.stack.Count == count2) { goto Block_518; } repeatContext.Count--; strpos = this.stack.Pop(); this.Backtrack(this.stack.Pop()); if (RxInterpreter.trace_rx) { Console.WriteLine("backtracking to {0} expr={1} pc={2}", strpos, repeatContext.Expression, pc); } } strpos = num43; this.stack.Count = count2; goto IL_3E14; Block_518: this.repeat = repeatContext; return false; } IL_3C23: bool flag3 = this.program[pc] == 156; int num47 = 0; int num48 = pc + ((int)this.program[pc + 1] | ((int)this.program[pc + 2] << 8)); i = RxInterpreter.ReadInt(this.program, pc + 3); num2 = RxInterpreter.ReadInt(this.program, pc + 7); j = 0; this.deep = null; while (j < i) { if (!this.EvalByteCode(pc + 11, strpos, ref num47)) { return false; } strpos = num47; j++; } if (flag3) { for (;;) { int num49 = this.Checkpoint(); if (this.EvalByteCode(num48, strpos, ref num47)) { break; } this.Backtrack(num49); if (j >= num2) { return false; } if (!this.EvalByteCode(pc + 11, strpos, ref num47)) { return false; } strpos = num47; j++; } strpos = num47; } else { int count3 = this.stack.Count; while (j < num2) { int num50 = this.Checkpoint(); if (!this.EvalByteCode(pc + 11, strpos, ref num47)) { this.Backtrack(num50); break; } this.stack.Push(num50); this.stack.Push(strpos); strpos = num47; j++; } if (num48 <= pc) { throw new Exception(); } while (!this.EvalByteCode(num48, strpos, ref num47)) { if (this.stack.Count == count3) { return false; } strpos = this.stack.Pop(); this.Backtrack(this.stack.Pop()); if (RxInterpreter.trace_rx) { Console.WriteLine("backtracking to: {0}", strpos); } } strpos = num47; this.stack.Count = count3; } goto IL_3E14; IL_3DE6: Console.WriteLine("evaluating: {0} at pc: {1}, strpos: {2}", (RxOp)this.program[pc], pc, strpos); throw new NotSupportedException(); IL_3E14: strpos_result = strpos; return true; } // Token: 0x040013F2 RID: 5106 private byte[] program; // Token: 0x040013F3 RID: 5107 private string str; // Token: 0x040013F4 RID: 5108 private int string_start; // Token: 0x040013F5 RID: 5109 private int string_end; // Token: 0x040013F6 RID: 5110 private int group_count; // Token: 0x040013F7 RID: 5111 private int[] groups; // Token: 0x040013F8 RID: 5112 private EvalDelegate eval_del; // Token: 0x040013F9 RID: 5113 private Mark[] marks; // Token: 0x040013FA RID: 5114 private int mark_start; // Token: 0x040013FB RID: 5115 private int mark_end; // Token: 0x040013FC RID: 5116 private RxInterpreter.IntStack stack; // Token: 0x040013FD RID: 5117 private RxInterpreter.RepeatContext repeat; // Token: 0x040013FE RID: 5118 private RxInterpreter.RepeatContext deep; // Token: 0x040013FF RID: 5119 public static readonly bool trace_rx; // Token: 0x020002B7 RID: 695 internal struct IntStack { // Token: 0x06001983 RID: 6531 RVA: 0x0005B024 File Offset: 0x00059224 public int Pop() { return this.values[--this.count]; } // Token: 0x06001984 RID: 6532 RVA: 0x0005B04C File Offset: 0x0005924C public void Push(int value) { if (this.values == null) { this.values = new int[8]; } else if (this.count == this.values.Length) { int num = this.values.Length; num += num >> 1; int[] array = new int[num]; for (int i = 0; i < this.count; i++) { array[i] = this.values[i]; } this.values = array; } this.values[this.count++] = value; } // Token: 0x170007F3 RID: 2035 // (get) Token: 0x06001985 RID: 6533 RVA: 0x0005B0E0 File Offset: 0x000592E0 public int Top { get { return this.values[this.count - 1]; } } // Token: 0x170007F4 RID: 2036 // (get) Token: 0x06001986 RID: 6534 RVA: 0x0005B0F4 File Offset: 0x000592F4 // (set) Token: 0x06001987 RID: 6535 RVA: 0x0005B0FC File Offset: 0x000592FC public int Count { get { return this.count; } set { if (value > this.count) { throw new SystemException("can only truncate the stack"); } this.count = value; } } // Token: 0x04001400 RID: 5120 private int[] values; // Token: 0x04001401 RID: 5121 private int count; } // Token: 0x020002B8 RID: 696 private class RepeatContext { // Token: 0x06001988 RID: 6536 RVA: 0x0005B11C File Offset: 0x0005931C public RepeatContext(RxInterpreter.RepeatContext previous, int min, int max, bool lazy, int expr_pc) { this.previous = previous; this.min = min; this.max = max; this.lazy = lazy; this.expr_pc = expr_pc; this.start = -1; this.count = 0; } // Token: 0x170007F5 RID: 2037 // (get) Token: 0x06001989 RID: 6537 RVA: 0x0005B158 File Offset: 0x00059358 // (set) Token: 0x0600198A RID: 6538 RVA: 0x0005B160 File Offset: 0x00059360 public int Count { get { return this.count; } set { this.count = value; } } // Token: 0x170007F6 RID: 2038 // (get) Token: 0x0600198B RID: 6539 RVA: 0x0005B16C File Offset: 0x0005936C // (set) Token: 0x0600198C RID: 6540 RVA: 0x0005B174 File Offset: 0x00059374 public int Start { get { return this.start; } set { this.start = value; } } // Token: 0x170007F7 RID: 2039 // (get) Token: 0x0600198D RID: 6541 RVA: 0x0005B180 File Offset: 0x00059380 public bool IsMinimum { get { return this.min <= this.count; } } // Token: 0x170007F8 RID: 2040 // (get) Token: 0x0600198E RID: 6542 RVA: 0x0005B194 File Offset: 0x00059394 public bool IsMaximum { get { return this.max <= this.count; } } // Token: 0x170007F9 RID: 2041 // (get) Token: 0x0600198F RID: 6543 RVA: 0x0005B1A8 File Offset: 0x000593A8 public bool IsLazy { get { return this.lazy; } } // Token: 0x170007FA RID: 2042 // (get) Token: 0x06001990 RID: 6544 RVA: 0x0005B1B0 File Offset: 0x000593B0 public int Expression { get { return this.expr_pc; } } // Token: 0x170007FB RID: 2043 // (get) Token: 0x06001991 RID: 6545 RVA: 0x0005B1B8 File Offset: 0x000593B8 public RxInterpreter.RepeatContext Previous { get { return this.previous; } } // Token: 0x04001402 RID: 5122 private int start; // Token: 0x04001403 RID: 5123 private int min; // Token: 0x04001404 RID: 5124 private int max; // Token: 0x04001405 RID: 5125 private bool lazy; // Token: 0x04001406 RID: 5126 private int expr_pc; // Token: 0x04001407 RID: 5127 private RxInterpreter.RepeatContext previous; // Token: 0x04001408 RID: 5128 private int count; } } }