Files
Dec2017-Script-Dump/mscorlib/Mono/Xml/SmallXmlParser.cs
T
2026-06-04 11:42:34 +02:00

782 lines
16 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using System;
using System.Collections;
using System.Globalization;
using System.IO;
using System.Text;
namespace Mono.Xml
{
// Token: 0x020000EF RID: 239
internal class SmallXmlParser
{
// Token: 0x06000BE4 RID: 3044 RVA: 0x00035B24 File Offset: 0x00033D24
private Exception Error(string msg)
{
return new SmallXmlParserException(msg, this.line, this.column);
}
// Token: 0x06000BE5 RID: 3045 RVA: 0x00035B38 File Offset: 0x00033D38
private Exception UnexpectedEndError()
{
string[] array = new string[this.elementNames.Count];
this.elementNames.CopyTo(array, 0);
return this.Error(string.Format("Unexpected end of stream. Element stack content is {0}", string.Join(",", array)));
}
// Token: 0x06000BE6 RID: 3046 RVA: 0x00035B80 File Offset: 0x00033D80
private bool IsNameChar(char c, bool start)
{
if (c == '-' || c == '.')
{
return !start;
}
if (c == ':' || c == '_')
{
return true;
}
if (c > 'Ā')
{
if (c == 'ۥ' || c == 'ۦ' || c == 'ՙ')
{
return true;
}
if ('ʻ' <= c && c <= 'ˁ')
{
return true;
}
}
switch (char.GetUnicodeCategory(c))
{
case UnicodeCategory.UppercaseLetter:
case UnicodeCategory.LowercaseLetter:
case UnicodeCategory.TitlecaseLetter:
case UnicodeCategory.OtherLetter:
case UnicodeCategory.LetterNumber:
return true;
case UnicodeCategory.ModifierLetter:
case UnicodeCategory.NonSpacingMark:
case UnicodeCategory.SpacingCombiningMark:
case UnicodeCategory.EnclosingMark:
case UnicodeCategory.DecimalDigitNumber:
return !start;
default:
return false;
}
}
// Token: 0x06000BE7 RID: 3047 RVA: 0x00035C4C File Offset: 0x00033E4C
private bool IsWhitespace(int c)
{
switch (c)
{
case 9:
case 10:
case 13:
break;
default:
if (c != 32)
{
return false;
}
break;
}
return true;
}
// Token: 0x06000BE8 RID: 3048 RVA: 0x00035C88 File Offset: 0x00033E88
public void SkipWhitespaces()
{
this.SkipWhitespaces(false);
}
// Token: 0x06000BE9 RID: 3049 RVA: 0x00035C94 File Offset: 0x00033E94
private void HandleWhitespaces()
{
while (this.IsWhitespace(this.Peek()))
{
this.buffer.Append((char)this.Read());
}
if (this.Peek() != 60 && this.Peek() >= 0)
{
this.isWhitespace = false;
}
}
// Token: 0x06000BEA RID: 3050 RVA: 0x00035CEC File Offset: 0x00033EEC
public void SkipWhitespaces(bool expected)
{
for (;;)
{
int num = this.Peek();
switch (num)
{
case 9:
case 10:
case 13:
break;
default:
if (num != 32)
{
goto Block_0;
}
break;
}
this.Read();
if (expected)
{
expected = false;
}
}
Block_0:
if (expected)
{
throw this.Error("Whitespace is expected.");
}
}
// Token: 0x06000BEB RID: 3051 RVA: 0x00035D58 File Offset: 0x00033F58
private int Peek()
{
return this.reader.Peek();
}
// Token: 0x06000BEC RID: 3052 RVA: 0x00035D68 File Offset: 0x00033F68
private int Read()
{
int num = this.reader.Read();
if (num == 10)
{
this.resetColumn = true;
}
if (this.resetColumn)
{
this.line++;
this.resetColumn = false;
this.column = 1;
}
else
{
this.column++;
}
return num;
}
// Token: 0x06000BED RID: 3053 RVA: 0x00035DCC File Offset: 0x00033FCC
public void Expect(int c)
{
int num = this.Read();
if (num < 0)
{
throw this.UnexpectedEndError();
}
if (num != c)
{
throw this.Error(string.Format("Expected '{0}' but got {1}", (char)c, (char)num));
}
}
// Token: 0x06000BEE RID: 3054 RVA: 0x00035E14 File Offset: 0x00034014
private string ReadUntil(char until, bool handleReferences)
{
while (this.Peek() >= 0)
{
char c = (char)this.Read();
if (c == until)
{
string text = this.buffer.ToString();
this.buffer.Length = 0;
return text;
}
if (handleReferences && c == '&')
{
this.ReadReference();
}
else
{
this.buffer.Append(c);
}
}
throw this.UnexpectedEndError();
}
// Token: 0x06000BEF RID: 3055 RVA: 0x00035E8C File Offset: 0x0003408C
public string ReadName()
{
int num = 0;
if (this.Peek() < 0 || !this.IsNameChar((char)this.Peek(), true))
{
throw this.Error("XML name start character is expected.");
}
for (int i = this.Peek(); i >= 0; i = this.Peek())
{
char c = (char)i;
if (!this.IsNameChar(c, false))
{
break;
}
if (num == this.nameBuffer.Length)
{
char[] array = new char[num * 2];
Array.Copy(this.nameBuffer, array, num);
this.nameBuffer = array;
}
this.nameBuffer[num++] = c;
this.Read();
}
if (num == 0)
{
throw this.Error("Valid XML name is expected.");
}
return new string(this.nameBuffer, 0, num);
}
// Token: 0x06000BF0 RID: 3056 RVA: 0x00035F54 File Offset: 0x00034154
public void Parse(TextReader input, SmallXmlParser.IContentHandler handler)
{
this.reader = input;
this.handler = handler;
handler.OnStartParsing(this);
while (this.Peek() >= 0)
{
this.ReadContent();
}
this.HandleBufferedContent();
if (this.elementNames.Count > 0)
{
throw this.Error(string.Format("Insufficient close tag: {0}", this.elementNames.Peek()));
}
handler.OnEndParsing(this);
this.Cleanup();
}
// Token: 0x06000BF1 RID: 3057 RVA: 0x00035FD0 File Offset: 0x000341D0
private void Cleanup()
{
this.line = 1;
this.column = 0;
this.handler = null;
this.reader = null;
this.elementNames.Clear();
this.xmlSpaces.Clear();
this.attributes.Clear();
this.buffer.Length = 0;
this.xmlSpace = null;
this.isWhitespace = false;
}
// Token: 0x06000BF2 RID: 3058 RVA: 0x00036034 File Offset: 0x00034234
public void ReadContent()
{
if (this.IsWhitespace(this.Peek()))
{
if (this.buffer.Length == 0)
{
this.isWhitespace = true;
}
this.HandleWhitespaces();
}
if (this.Peek() != 60)
{
this.ReadCharacters();
return;
}
this.Read();
int num = this.Peek();
if (num != 33)
{
if (num != 47)
{
string text;
if (num != 63)
{
this.HandleBufferedContent();
text = this.ReadName();
while (this.Peek() != 62 && this.Peek() != 47)
{
this.ReadAttribute(this.attributes);
}
this.handler.OnStartElement(text, this.attributes);
this.attributes.Clear();
this.SkipWhitespaces();
if (this.Peek() == 47)
{
this.Read();
this.handler.OnEndElement(text);
}
else
{
this.elementNames.Push(text);
this.xmlSpaces.Push(this.xmlSpace);
}
this.Expect(62);
return;
}
this.HandleBufferedContent();
this.Read();
text = this.ReadName();
this.SkipWhitespaces();
string text2 = string.Empty;
if (this.Peek() != 63)
{
for (;;)
{
text2 += this.ReadUntil('?', false);
if (this.Peek() == 62)
{
break;
}
text2 += "?";
}
}
this.handler.OnProcessingInstruction(text, text2);
this.Expect(62);
return;
}
else
{
this.HandleBufferedContent();
if (this.elementNames.Count == 0)
{
throw this.UnexpectedEndError();
}
this.Read();
string text = this.ReadName();
this.SkipWhitespaces();
string text3 = (string)this.elementNames.Pop();
this.xmlSpaces.Pop();
if (this.xmlSpaces.Count > 0)
{
this.xmlSpace = (string)this.xmlSpaces.Peek();
}
else
{
this.xmlSpace = null;
}
if (text != text3)
{
throw this.Error(string.Format("End tag mismatch: expected {0} but found {1}", text3, text));
}
this.handler.OnEndElement(text);
this.Expect(62);
return;
}
}
else
{
this.Read();
if (this.Peek() == 91)
{
this.Read();
if (this.ReadName() != "CDATA")
{
throw this.Error("Invalid declaration markup");
}
this.Expect(91);
this.ReadCDATASection();
return;
}
else
{
if (this.Peek() == 45)
{
this.ReadComment();
return;
}
if (this.ReadName() != "DOCTYPE")
{
throw this.Error("Invalid declaration markup.");
}
throw this.Error("This parser does not support document type.");
}
}
}
// Token: 0x06000BF3 RID: 3059 RVA: 0x0003630C File Offset: 0x0003450C
private void HandleBufferedContent()
{
if (this.buffer.Length == 0)
{
return;
}
if (this.isWhitespace)
{
this.handler.OnIgnorableWhitespace(this.buffer.ToString());
}
else
{
this.handler.OnChars(this.buffer.ToString());
}
this.buffer.Length = 0;
this.isWhitespace = false;
}
// Token: 0x06000BF4 RID: 3060 RVA: 0x0003637C File Offset: 0x0003457C
private void ReadCharacters()
{
this.isWhitespace = false;
for (;;)
{
int num = this.Peek();
int num2 = num;
if (num2 == -1)
{
break;
}
if (num2 != 38)
{
if (num2 == 60)
{
return;
}
this.buffer.Append((char)this.Read());
}
else
{
this.Read();
this.ReadReference();
}
}
}
// Token: 0x06000BF5 RID: 3061 RVA: 0x000363E8 File Offset: 0x000345E8
private void ReadReference()
{
if (this.Peek() != 35)
{
string text = this.ReadName();
this.Expect(59);
string text2 = text;
switch (text2)
{
case "amp":
this.buffer.Append('&');
return;
case "quot":
this.buffer.Append('"');
return;
case "apos":
this.buffer.Append('\'');
return;
case "lt":
this.buffer.Append('<');
return;
case "gt":
this.buffer.Append('>');
return;
}
throw this.Error("General non-predefined entity reference is not supported in this parser.");
}
this.Read();
this.ReadCharacterReference();
}
// Token: 0x06000BF6 RID: 3062 RVA: 0x0003651C File Offset: 0x0003471C
private int ReadCharacterReference()
{
int num = 0;
if (this.Peek() == 120)
{
this.Read();
for (int i = this.Peek(); i >= 0; i = this.Peek())
{
if (48 <= i && i <= 57)
{
num <<= 4 + i - 48;
}
else if (65 <= i && i <= 70)
{
num <<= 4 + i - 65 + 10;
}
else
{
if (97 > i || i > 102)
{
break;
}
num <<= 4 + i - 97 + 10;
}
this.Read();
}
}
else
{
for (int j = this.Peek(); j >= 0; j = this.Peek())
{
if (48 > j || j > 57)
{
break;
}
num <<= 4 + j - 48;
this.Read();
}
}
return num;
}
// Token: 0x06000BF7 RID: 3063 RVA: 0x0003661C File Offset: 0x0003481C
private void ReadAttribute(SmallXmlParser.AttrListImpl a)
{
this.SkipWhitespaces(true);
if (this.Peek() == 47 || this.Peek() == 62)
{
return;
}
string text = this.ReadName();
this.SkipWhitespaces();
this.Expect(61);
this.SkipWhitespaces();
int num = this.Read();
string text2;
if (num != 34)
{
if (num != 39)
{
throw this.Error("Invalid attribute value markup.");
}
text2 = this.ReadUntil('\'', true);
}
else
{
text2 = this.ReadUntil('"', true);
}
if (text == "xml:space")
{
this.xmlSpace = text2;
}
a.Add(text, text2);
}
// Token: 0x06000BF8 RID: 3064 RVA: 0x000366CC File Offset: 0x000348CC
private void ReadCDATASection()
{
int num = 0;
while (this.Peek() >= 0)
{
char c = (char)this.Read();
if (c == ']')
{
num++;
}
else
{
if (c == '>' && num > 1)
{
for (int i = num; i > 2; i--)
{
this.buffer.Append(']');
}
return;
}
for (int j = 0; j < num; j++)
{
this.buffer.Append(']');
}
num = 0;
this.buffer.Append(c);
}
}
throw this.UnexpectedEndError();
}
// Token: 0x06000BF9 RID: 3065 RVA: 0x00036770 File Offset: 0x00034970
private void ReadComment()
{
this.Expect(45);
this.Expect(45);
for (;;)
{
if (this.Read() == 45)
{
if (this.Read() == 45)
{
break;
}
}
}
if (this.Read() != 62)
{
throw this.Error("'--' is not allowed inside comment markup.");
}
}
// Token: 0x04000342 RID: 834
private SmallXmlParser.IContentHandler handler;
// Token: 0x04000343 RID: 835
private TextReader reader;
// Token: 0x04000344 RID: 836
private Stack elementNames = new Stack();
// Token: 0x04000345 RID: 837
private Stack xmlSpaces = new Stack();
// Token: 0x04000346 RID: 838
private string xmlSpace;
// Token: 0x04000347 RID: 839
private StringBuilder buffer = new StringBuilder(200);
// Token: 0x04000348 RID: 840
private char[] nameBuffer = new char[30];
// Token: 0x04000349 RID: 841
private bool isWhitespace;
// Token: 0x0400034A RID: 842
private SmallXmlParser.AttrListImpl attributes = new SmallXmlParser.AttrListImpl();
// Token: 0x0400034B RID: 843
private int line = 1;
// Token: 0x0400034C RID: 844
private int column;
// Token: 0x0400034D RID: 845
private bool resetColumn;
// Token: 0x020000F0 RID: 240
public interface IContentHandler
{
// Token: 0x06000BFA RID: 3066
void OnStartParsing(SmallXmlParser parser);
// Token: 0x06000BFB RID: 3067
void OnEndParsing(SmallXmlParser parser);
// Token: 0x06000BFC RID: 3068
void OnStartElement(string name, SmallXmlParser.IAttrList attrs);
// Token: 0x06000BFD RID: 3069
void OnEndElement(string name);
// Token: 0x06000BFE RID: 3070
void OnProcessingInstruction(string name, string text);
// Token: 0x06000BFF RID: 3071
void OnChars(string text);
// Token: 0x06000C00 RID: 3072
void OnIgnorableWhitespace(string text);
}
// Token: 0x020000F1 RID: 241
public interface IAttrList
{
// Token: 0x170001B8 RID: 440
// (get) Token: 0x06000C01 RID: 3073
int Length { get; }
// Token: 0x170001B9 RID: 441
// (get) Token: 0x06000C02 RID: 3074
bool IsEmpty { get; }
// Token: 0x06000C03 RID: 3075
string GetName(int i);
// Token: 0x06000C04 RID: 3076
string GetValue(int i);
// Token: 0x06000C05 RID: 3077
string GetValue(string name);
// Token: 0x170001BA RID: 442
// (get) Token: 0x06000C06 RID: 3078
string[] Names { get; }
// Token: 0x170001BB RID: 443
// (get) Token: 0x06000C07 RID: 3079
string[] Values { get; }
}
// Token: 0x020000F2 RID: 242
private class AttrListImpl : SmallXmlParser.IAttrList
{
// Token: 0x170001BC RID: 444
// (get) Token: 0x06000C09 RID: 3081 RVA: 0x000367F4 File Offset: 0x000349F4
public int Length
{
get
{
return this.attrNames.Count;
}
}
// Token: 0x170001BD RID: 445
// (get) Token: 0x06000C0A RID: 3082 RVA: 0x00036804 File Offset: 0x00034A04
public bool IsEmpty
{
get
{
return this.attrNames.Count == 0;
}
}
// Token: 0x06000C0B RID: 3083 RVA: 0x00036814 File Offset: 0x00034A14
public string GetName(int i)
{
return (string)this.attrNames[i];
}
// Token: 0x06000C0C RID: 3084 RVA: 0x00036828 File Offset: 0x00034A28
public string GetValue(int i)
{
return (string)this.attrValues[i];
}
// Token: 0x06000C0D RID: 3085 RVA: 0x0003683C File Offset: 0x00034A3C
public string GetValue(string name)
{
for (int i = 0; i < this.attrNames.Count; i++)
{
if ((string)this.attrNames[i] == name)
{
return (string)this.attrValues[i];
}
}
return null;
}
// Token: 0x170001BE RID: 446
// (get) Token: 0x06000C0E RID: 3086 RVA: 0x00036894 File Offset: 0x00034A94
public string[] Names
{
get
{
return (string[])this.attrNames.ToArray(typeof(string));
}
}
// Token: 0x170001BF RID: 447
// (get) Token: 0x06000C0F RID: 3087 RVA: 0x000368B0 File Offset: 0x00034AB0
public string[] Values
{
get
{
return (string[])this.attrValues.ToArray(typeof(string));
}
}
// Token: 0x06000C10 RID: 3088 RVA: 0x000368CC File Offset: 0x00034ACC
internal void Clear()
{
this.attrNames.Clear();
this.attrValues.Clear();
}
// Token: 0x06000C11 RID: 3089 RVA: 0x000368E4 File Offset: 0x00034AE4
internal void Add(string name, string value)
{
this.attrNames.Add(name);
this.attrValues.Add(value);
}
// Token: 0x0400034F RID: 847
private ArrayList attrNames = new ArrayList();
// Token: 0x04000350 RID: 848
private ArrayList attrValues = new ArrayList();
}
}
}