private void ParseSubset()
{
int startTagEntityId;
for (;;)
{
Token token = GetToken(false);
startTagEntityId = _currentEntityId;
switch (token)
{
case Token.AttlistDecl:
ParseAttlistDecl();
break;
case Token.ElementDecl:
ParseElementDecl();
break;
case Token.EntityDecl:
ParseEntityDecl();
break;
case Token.NotationDecl:
ParseNotationDecl();
break;
case Token.Comment:
ParseComment();
break;
case Token.PI:
ParsePI();
break;
case Token.CondSectionStart:
if (ParsingInternalSubset)
{
Throw(_curPos - 3, SR.Xml_InvalidConditionalSection); // 3==strlen("<![")
}
ParseCondSection();
startTagEntityId = _currentEntityId;
break;
case Token.CondSectionEnd:
if (_condSectionDepth > 0)
{
_condSectionDepth--;
#if !SILVERLIGHT
if (_validate && _currentEntityId != _condSectionEntityIds[_condSectionDepth])
{
SendValidationEvent(_curPos, XmlSeverityType.Error, SR.Sch_ParEntityRefNesting, string.Empty);
}
#endif
}
else
{
Throw(_curPos - 3, SR.Xml_UnexpectedCDataEnd);
}
break;
case Token.RightBracket:
if (ParsingInternalSubset)
{
if (_condSectionDepth != 0)
{
Throw(_curPos, SR.Xml_UnclosedConditionalSection);
}
// append the rest to internal subset value but not the closing ']'
if (_internalSubsetValueSb != null)
{
Debug.Assert(_curPos > 0 && _chars[_curPos - 1] == ']');
SaveParsingBuffer(_curPos - 1);
_schemaInfo.InternalDtdSubset = _internalSubsetValueSb.ToString();
_internalSubsetValueSb = null;
}
// check '>'
if (GetToken(false) != Token.GreaterThan)
{
ThrowUnexpectedToken(_curPos, ">");
}
#if DEBUG
// check entity nesting
Debug.Assert( readerAdapter.EntityStackLength == 0 ||
( freeFloatingDtd && readerAdapter.EntityStackLength == 1 ) );
#endif
}
else
{
Throw(_curPos, SR.Xml_ExpectDtdMarkup);
}
return;
case Token.Eof:
if (ParsingInternalSubset && !_freeFloatingDtd)
{
Throw(_curPos, SR.Xml_IncompleteDtdContent);
}
if (_condSectionDepth != 0)
{
Throw(_curPos, SR.Xml_UnclosedConditionalSection);
}
return;
default:
Debug.Assert(false);
break;
}
Debug.Assert(_scanningFunction == ScanningFunction.SubsetContent);
if (_currentEntityId != startTagEntityId)
{
#if SILVERLIGHT
Throw(curPos, SR.Sch_ParEntityRefNesting);
#else
if (_validate)
{
SendValidationEvent(_curPos, XmlSeverityType.Error, SR.Sch_ParEntityRefNesting, string.Empty);
}
else
{
if (!_v1Compat)
{
Throw(_curPos, SR.Sch_ParEntityRefNesting);
}
}
#endif
}
}
}