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);
}