private void SkipDtd()
{
int colonPos;
// parse dtd name
int pos = ParseQName(out colonPos);
_ps.charPos = pos;
// check whitespace
EatWhitespaces(null);
// PUBLIC Id
if (_ps.chars[_ps.charPos] == 'P')
{
// make sure we have enough characters
while (_ps.charsUsed - _ps.charPos < 6)
{
if (ReadData() == 0)
{
Throw(SR.Xml_UnexpectedEOF1);
}
}
// check 'PUBLIC'
if (!XmlConvert.StrEqual(_ps.chars, _ps.charPos, 6, "PUBLIC"))
{
ThrowUnexpectedToken("PUBLIC");
}
_ps.charPos += 6;
// check whitespace
if (EatWhitespaces(null) == 0)
{
ThrowExpectingWhitespace(_ps.charPos);
}
// parse PUBLIC value
SkipPublicOrSystemIdLiteral();
// check whitespace
if (EatWhitespaces(null) == 0)
{
ThrowExpectingWhitespace(_ps.charPos);
}
// parse SYSTEM value
SkipPublicOrSystemIdLiteral();
EatWhitespaces(null);
}
else if (_ps.chars[_ps.charPos] == 'S')
{
// make sure we have enough characters
while (_ps.charsUsed - _ps.charPos < 6)
{
if (ReadData() == 0)
{
Throw(SR.Xml_UnexpectedEOF1);
}
}
// check 'SYSTEM'
if (!XmlConvert.StrEqual(_ps.chars, _ps.charPos, 6, "SYSTEM"))
{
ThrowUnexpectedToken("SYSTEM");
}
_ps.charPos += 6;
// check whitespace
if (EatWhitespaces(null) == 0)
{
ThrowExpectingWhitespace(_ps.charPos);
}
// parse SYSTEM value
SkipPublicOrSystemIdLiteral();
EatWhitespaces(null);
}
else if (_ps.chars[_ps.charPos] != '[' && _ps.chars[_ps.charPos] != '>')
{
Throw(SR.Xml_ExpectExternalOrClose);
}
// internal DTD
if (_ps.chars[_ps.charPos] == '[')
{
_ps.charPos++;
SkipUntil(']', true);
EatWhitespaces(null);
if (_ps.chars[_ps.charPos] != '>')
{
ThrowUnexpectedToken(">");
}
}
else if (_ps.chars[_ps.charPos] == '>')
{
_curNode.SetValue(string.Empty);
}
else
{
Throw(SR.Xml_ExpectSubOrClose);
}
_ps.charPos++;
}