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); }
public void Parse(MiniParser.IReader reader, MiniParser.IHandler handler) { if (reader == null) { throw new ArgumentNullException(nameof(reader)); } if (handler == null) { handler = (MiniParser.IHandler) new MiniParser.HandlerAdapter(); } MiniParser.AttrListImpl attrListImpl = new MiniParser.AttrListImpl(); string name1 = (string)null; Stack stack = new Stack(); string name2 = (string)null; this.line = 1; this.col = 0; int state = 0; StringBuilder sb = new StringBuilder(); bool flag1 = false; bool flag2 = false; bool flag3 = false; int num1 = 0; handler.OnStartParsing(this); while (true) { int num2; int num3; do { do { int num4; do { int charCode; do { ++this.col; num2 = reader.Read(); if (num2 == -1) { if (state != 0) { this.FatalErr("Unexpected EOF"); goto label_106; } else { goto label_106; } } else { charCode = "<>/?=&'\"![ ]\t\r\n".IndexOf((char)num2) & 15; } }while (charCode == 13); if (charCode == 12) { charCode = 10; } if (charCode == 14) { this.col = 0; ++this.line; charCode = 10; } num4 = MiniParser.Xlat(charCode, state); state = num4 & (int)byte.MaxValue; }while (num2 == 10 && (state == 14 || state == 15)); num3 = num4 >> 8; if (state >= 128) { if (state == (int)byte.MaxValue) { this.FatalErr("State dispatch error."); } else { this.FatalErr(MiniParser.errors[state ^ 128]); } } switch (num3) { case 0: handler.OnStartElement(name2, (MiniParser.IAttrList)attrListImpl); if (num2 != 47) { stack.Push((object)name2); } else { handler.OnEndElement(name2); } attrListImpl.Clear(); continue; case 1: name2 = sb.ToString(); sb = new StringBuilder(); string str1 = (string)null; if (stack.Count == 0 || name2 != (str1 = stack.Pop() as string)) { if (str1 == null) { this.FatalErr("Tag stack underflow"); } else { this.FatalErr(string.Format("Expected end tag '{0}' but found '{1}'", (object)name2, (object)str1)); } } handler.OnEndElement(name2); continue; case 2: name2 = sb.ToString(); sb = new StringBuilder(); if (num2 == 47 || num2 == 62) { goto case 0; } else { continue; } case 3: name1 = sb.ToString(); sb = new StringBuilder(); continue; case 4: if (name1 == null) { this.FatalErr("Internal error."); } attrListImpl.Add(name1, sb.ToString()); sb = new StringBuilder(); name1 = (string)null; continue; case 5: handler.OnChars(sb.ToString()); sb = new StringBuilder(); continue; case 6: string str2 = "CDATA["; flag2 = false; flag3 = false; switch (num2) { case 45: if (reader.Read() != 45) { this.FatalErr("Invalid comment"); } ++this.col; flag2 = true; this.twoCharBuff[0] = -1; this.twoCharBuff[1] = -1; continue; case 91: for (int index = 0; index < str2.Length; ++index) { if (reader.Read() != (int)str2[index]) { this.col += index + 1; break; } } this.col += str2.Length; flag1 = true; continue; default: flag3 = true; num1 = 0; continue; } case 7: int num5 = 0; int num6 = 93; while (true) { switch (num6) { case 62: goto label_52; case 93: num6 = reader.Read(); ++num5; continue; default: goto label_48; } } label_48: for (int index = 0; index < num5; ++index) { sb.Append(']'); } sb.Append((char)num6); state = 18; goto label_56; label_52: for (int index = 0; index < num5 - 2; ++index) { sb.Append(']'); } flag1 = false; label_56: this.col += num5; continue; case 8: this.FatalErr(string.Format("Error {0}", (object)state)); continue; case 9: continue; case 10: sb = new StringBuilder(); continue; case 11: goto label_59; case 12: goto label_60; case 13: goto label_72; default: goto label_105; } }while (num2 == 60); label_59: sb.Append((char)num2); continue; label_60: if (flag2) { if (num2 == 62 && this.twoCharBuff[0] == 45 && this.twoCharBuff[1] == 45) { flag2 = false; state = 0; } else { this.twoCharBuff[0] = this.twoCharBuff[1]; this.twoCharBuff[1] = num2; } } else if (flag3) { if (num2 == 60 || num2 == 62) { num1 ^= 1; } } else { goto label_69; } }while (num2 != 62 || num1 == 0); flag3 = false; state = 0; continue; label_69: if (this.splitCData && sb.Length > 0 && flag1) { handler.OnChars(sb.ToString()); sb = new StringBuilder(); } flag1 = false; sb.Append((char)num2); continue; label_72: int num7 = reader.Read(); int num8 = this.col + 1; if (num7 == 35) { int num4 = 10; int num5 = 0; int num6 = 0; int num9 = reader.Read(); ++num8; if (num9 == 120) { num9 = reader.Read(); ++num8; num4 = 16; } NumberStyles style = num4 != 16 ? NumberStyles.Integer : NumberStyles.HexNumber; while (true) { int num10 = -1; if (!char.IsNumber((char)num9)) { if ("abcdef".IndexOf(char.ToLower((char)num9)) == -1) { goto label_80; } } try { num10 = int.Parse(new string((char)num9, 1), style); } catch (FormatException) { num10 = -1; } label_80: if (num10 != -1) { num5 = num5 * num4 + num10; ++num6; num9 = reader.Read(); ++num8; } else { break; } } if (num9 == 59 && num6 > 0) { sb.Append((char)num5); } else { this.FatalErr("Bad char ref"); } } else { string str1 = "aglmopqstu"; string str2 = "&'\"><"; int index1 = 0; int index2 = 15; int num4 = 0; int length = sb.Length; while (true) { int num5; do { if (index1 != 15) { index1 = str1.IndexOf((char)num7) & 15; } if (index1 == 15) { this.FatalErr(MiniParser.errors[7]); } sb.Append((char)num7); num5 = (int)"U㾏侏ཟク\xE1F4⊙\xEEFF\xEEFFo"[index1]; int index3 = num5 >> 4 & 15; int index4 = num5 & 15; int num6 = num5 >> 12; int num9 = num5 >> 8 & 15; num7 = reader.Read(); ++num8; index1 = 15; if (index3 != 15 && num7 == (int)str1[index3]) { if (num6 < 14) { index2 = num6; } num4 = 12; goto label_100; } else if (index4 != 15 && num7 == (int)str1[index4]) { if (num9 < 14) { index2 = num9; } num4 = 8; goto label_100; } else if (num7 != 59) { goto label_100; } }while (index2 == 15 || num4 == 0 || (num5 >> num4 & 15) != 14); break; label_100: index1 = 0; } int len = num8 - this.col - 1; if (len > 0 && len < 5 && (MiniParser.StrEquals("amp", sb, length, len) || MiniParser.StrEquals("apos", sb, length, len) || (MiniParser.StrEquals("quot", sb, length, len) || MiniParser.StrEquals("lt", sb, length, len)) || MiniParser.StrEquals("gt", sb, length, len))) { sb.Length = length; sb.Append(str2[index2]); } else { this.FatalErr(MiniParser.errors[7]); } } this.col = num8; continue; label_105: this.FatalErr(string.Format("Unexpected action code - {0}.", (object)num3)); } label_106: handler.OnEndParsing(this); }