private Token ScanSubsetContent()
{
for (;;)
{
switch (_chars[_curPos])
{
case '<':
switch (_chars[_curPos + 1])
{
case '!':
switch (_chars[_curPos + 2])
{
case 'E':
if (_chars[_curPos + 3] == 'L')
{
if (_charsUsed - _curPos < 9)
{
goto ReadData;
}
if (_chars[_curPos + 4] != 'E' || _chars[_curPos + 5] != 'M' ||
_chars[_curPos + 6] != 'E' || _chars[_curPos + 7] != 'N' ||
_chars[_curPos + 8] != 'T')
{
Throw(_curPos, SR.Xml_ExpectDtdMarkup);
}
_curPos += 9;
_scanningFunction = ScanningFunction.QName;
_nextScaningFunction = ScanningFunction.Element1;
return Token.ElementDecl;
}
else if (_chars[_curPos + 3] == 'N')
{
if (_charsUsed - _curPos < 8)
{
goto ReadData;
}
if (_chars[_curPos + 4] != 'T' || _chars[_curPos + 5] != 'I' ||
_chars[_curPos + 6] != 'T' || _chars[_curPos + 7] != 'Y')
{
Throw(_curPos, SR.Xml_ExpectDtdMarkup);
}
_curPos += 8;
_scanningFunction = ScanningFunction.Entity1;
return Token.EntityDecl;
}
else
{
if (_charsUsed - _curPos < 4)
{
goto ReadData;
}
Throw(_curPos, SR.Xml_ExpectDtdMarkup);
return Token.None;
}
case 'A':
if (_charsUsed - _curPos < 9)
{
goto ReadData;
}
if (_chars[_curPos + 3] != 'T' || _chars[_curPos + 4] != 'T' ||
_chars[_curPos + 5] != 'L' || _chars[_curPos + 6] != 'I' ||
_chars[_curPos + 7] != 'S' || _chars[_curPos + 8] != 'T')
{
Throw(_curPos, SR.Xml_ExpectDtdMarkup);
}
_curPos += 9;
_scanningFunction = ScanningFunction.QName;
_nextScaningFunction = ScanningFunction.Attlist1;
return Token.AttlistDecl;
case 'N':
if (_charsUsed - _curPos < 10)
{
goto ReadData;
}
if (_chars[_curPos + 3] != 'O' || _chars[_curPos + 4] != 'T' ||
_chars[_curPos + 5] != 'A' || _chars[_curPos + 6] != 'T' ||
_chars[_curPos + 7] != 'I' || _chars[_curPos + 8] != 'O' ||
_chars[_curPos + 9] != 'N')
{
Throw(_curPos, SR.Xml_ExpectDtdMarkup);
}
_curPos += 10;
_scanningFunction = ScanningFunction.Name;
_nextScaningFunction = ScanningFunction.Notation1;
return Token.NotationDecl;
case '[':
_curPos += 3;
_scanningFunction = ScanningFunction.CondSection1;
return Token.CondSectionStart;
case '-':
if (_chars[_curPos + 3] == '-')
{
_curPos += 4;
return Token.Comment;
}
else
{
if (_charsUsed - _curPos < 4)
{
goto ReadData;
}
Throw(_curPos, SR.Xml_ExpectDtdMarkup);
break;
}
default:
if (_charsUsed - _curPos < 3)
{
goto ReadData;
}
Throw(_curPos + 2, SR.Xml_ExpectDtdMarkup);
break;
}
break;
case '?':
_curPos += 2;
return Token.PI;
default:
if (_charsUsed - _curPos < 2)
{
goto ReadData;
}
Throw(_curPos, SR.Xml_ExpectDtdMarkup);
return Token.None;
}
break;
case ']':
if (_charsUsed - _curPos < 2 && !_readerAdapter.IsEof)
{
goto ReadData;
}
if (_chars[_curPos + 1] != ']')
{
_curPos++;
_scanningFunction = ScanningFunction.ClosingTag;
return Token.RightBracket;
}
if (_charsUsed - _curPos < 3 && !_readerAdapter.IsEof)
{
goto ReadData;
}
if (_chars[_curPos + 1] == ']' && _chars[_curPos + 2] == '>')
{
_curPos += 3;
return Token.CondSectionEnd;
}
goto default;
default:
if (_charsUsed - _curPos == 0)
{
goto ReadData;
}
Throw(_curPos, SR.Xml_ExpectDtdMarkup);
break;
}
ReadData:
if (ReadData() == 0)
{
Throw(_charsUsed, SR.Xml_IncompleteDtdContent);
}
}
}