public void Parse(MiniParser.IReader reader, MiniParser.IHandler handler) { if (reader == null) { throw new ArgumentNullException("reader"); } if (handler == null) { handler = new MiniParser.HandlerAdapter(); } MiniParser.AttrListImpl attrListImpl = new MiniParser.AttrListImpl(); string text = null; Stack stack = new Stack(); string text2 = null; this.line = 1; this.col = 0; int num = 0; int num2 = 0; StringBuilder stringBuilder = new StringBuilder(); bool flag = false; bool flag2 = false; bool flag3 = false; int num3 = 0; handler.OnStartParsing(this); while (true) { this.col++; num = reader.Read(); if (num == -1) { break; } int num4 = "<>/?=&'\"![ ]\t\r\n".IndexOf((char)num) & 15; if (num4 != 13) { if (num4 == 12) { num4 = 10; } if (num4 == 14) { this.col = 0; this.line++; num4 = 10; } int num5 = MiniParser.Xlat(num4, num2); num2 = (num5 & 255); if (num != 10 || (num2 != 14 && num2 != 15)) { num5 >>= 8; if (num2 >= 128) { if (num2 == 255) { this.FatalErr("State dispatch error."); } else { this.FatalErr(MiniParser.errors[num2 ^ 128]); } } switch (num5) { case 0: goto IL_19F; case 1: { text2 = stringBuilder.ToString(); stringBuilder = new StringBuilder(); string text3 = null; if (stack.get_Count() == 0 || text2 != (text3 = (stack.Pop() as string))) { if (text3 == null) { this.FatalErr("Tag stack underflow"); } else { this.FatalErr(string.Format("Expected end tag '{0}' but found '{1}'", text2, text3)); } } handler.OnEndElement(text2); break; } case 2: text2 = stringBuilder.ToString(); stringBuilder = new StringBuilder(); if (num == 47 || num == 62) { goto IL_19F; } break; case 3: text = stringBuilder.ToString(); stringBuilder = new StringBuilder(); break; case 4: if (text == null) { this.FatalErr("Internal error."); } attrListImpl.Add(text, stringBuilder.ToString()); stringBuilder = new StringBuilder(); text = null; break; case 5: handler.OnChars(stringBuilder.ToString()); stringBuilder = new StringBuilder(); break; case 6: { string text4 = "CDATA["; flag2 = false; flag3 = false; if (num == 45) { num = reader.Read(); if (num != 45) { this.FatalErr("Invalid comment"); } this.col++; flag2 = true; this.twoCharBuff[0] = -1; this.twoCharBuff[1] = -1; } else if (num != 91) { flag3 = true; num3 = 0; } else { for (int i = 0; i < text4.get_Length(); i++) { if (reader.Read() != (int)text4.get_Chars(i)) { this.col += i + 1; break; } } this.col += text4.get_Length(); flag = true; } break; } case 7: { int num6 = 0; num = 93; while (num == 93) { num = reader.Read(); num6++; } if (num != 62) { for (int j = 0; j < num6; j++) { stringBuilder.Append(']'); } stringBuilder.Append((char)num); num2 = 18; } else { for (int k = 0; k < num6 - 2; k++) { stringBuilder.Append(']'); } flag = false; } this.col += num6; break; } case 8: this.FatalErr(string.Format("Error {0}", num2)); break; case 9: break; case 10: stringBuilder = new StringBuilder(); if (num != 60) { goto IL_465; } break; case 11: goto IL_465; case 12: if (flag2) { if (num == 62 && this.twoCharBuff[0] == 45 && this.twoCharBuff[1] == 45) { flag2 = false; num2 = 0; } else { this.twoCharBuff[0] = this.twoCharBuff[1]; this.twoCharBuff[1] = num; } } else if (flag3) { if (num == 60 || num == 62) { num3 ^= 1; } if (num == 62 && num3 != 0) { flag3 = false; num2 = 0; } } else { if (this.splitCData && stringBuilder.get_Length() > 0 && flag) { handler.OnChars(stringBuilder.ToString()); stringBuilder = new StringBuilder(); } flag = false; stringBuilder.Append((char)num); } break; case 13: { num = reader.Read(); int num7 = this.col + 1; if (num == 35) { int num8 = 10; int num9 = 0; int num10 = 0; num = reader.Read(); num7++; if (num == 120) { num = reader.Read(); num7++; num8 = 16; } NumberStyles numberStyles = (num8 != 16) ? 7 : 515; while (true) { int num11 = -1; if (char.IsNumber((char)num)) { goto IL_5D9; } if ("abcdef".IndexOf(char.ToLower((char)num)) != -1) { goto Block_43; } IL_5F9: if (num11 == -1) { break; } num9 *= num8; num9 += num11; num10++; num = reader.Read(); num7++; continue; Block_43: try { IL_5D9: num11 = int.Parse(new string((char)num, 1), numberStyles); } catch (FormatException) { num11 = -1; } goto IL_5F9; } if (num == 59 && num10 > 0) { stringBuilder.Append((char)num9); } else { this.FatalErr("Bad char ref"); } } else { string text5 = "aglmopqstu"; string text6 = "&'\"><"; int num12 = 0; int num13 = 15; int num14 = 0; int length = stringBuilder.get_Length(); while (true) { if (num12 != 15) { num12 = (text5.IndexOf((char)num) & 15); } if (num12 == 15) { this.FatalErr(MiniParser.errors[7]); } stringBuilder.Append((char)num); int num15 = (int)"U㾏侏ཟク⊙o".get_Chars(num12); int num16 = num15 >> 4 & 15; int num17 = num15 & 15; int num18 = num15 >> 12; int num19 = num15 >> 8 & 15; num = reader.Read(); num7++; num12 = 15; if (num16 != 15 && num == (int)text5.get_Chars(num16)) { if (num18 < 14) { num13 = num18; } num14 = 12; } else if (num17 != 15 && num == (int)text5.get_Chars(num17)) { if (num19 < 14) { num13 = num19; } num14 = 8; } else if (num == 59) { if (num13 != 15 && num14 != 0 && (num15 >> num14 & 15) == 14) { break; } continue; } num12 = 0; } int num20 = num7 - this.col - 1; if (num20 > 0 && num20 < 5 && (MiniParser.StrEquals("amp", stringBuilder, length, num20) || MiniParser.StrEquals("apos", stringBuilder, length, num20) || MiniParser.StrEquals("quot", stringBuilder, length, num20) || MiniParser.StrEquals("lt", stringBuilder, length, num20) || MiniParser.StrEquals("gt", stringBuilder, length, num20))) { stringBuilder.set_Length(length); stringBuilder.Append(text6.get_Chars(num13)); } else { this.FatalErr(MiniParser.errors[7]); } } this.col = num7; break; } default: this.FatalErr(string.Format("Unexpected action code - {0}.", num5)); break; } continue; IL_19F: handler.OnStartElement(text2, attrListImpl); if (num != 47) { stack.Push(text2); } else { handler.OnEndElement(text2); } attrListImpl.Clear(); continue; IL_465: stringBuilder.Append((char)num); } } } if (num2 != 0) { this.FatalErr("Unexpected EOF"); } handler.OnEndParsing(this); }