private void ParseEntityDecl()
{
bool isParamEntity = false;
SchemaEntity entity = null;
// get entity name and type
switch (GetToken(true))
{
case Token.Percent:
isParamEntity = true;
if (GetToken(true) != Token.Name)
{
goto UnexpectedError;
}
goto case Token.Name;
case Token.Name:
// create entity object
XmlQualifiedName entityName = GetNameQualified(false);
entity = new SchemaEntity(entityName, isParamEntity);
entity.BaseURI = BaseUriStr;
entity.DeclaredURI = (_externalDtdBaseUri.Length == 0) ? _documentBaseUri : _externalDtdBaseUri;
if (isParamEntity)
{
if (!_schemaInfo.ParameterEntities.ContainsKey(entityName))
{
_schemaInfo.ParameterEntities.Add(entityName, entity);
}
}
else
{
if (!_schemaInfo.GeneralEntities.ContainsKey(entityName))
{
_schemaInfo.GeneralEntities.Add(entityName, entity);
}
}
entity.DeclaredInExternal = !ParsingInternalSubset;
entity.ParsingInProgress = true;
break;
default:
goto UnexpectedError;
}
Token token = GetToken(true);
switch (token)
{
case Token.PUBLIC:
case Token.SYSTEM:
string systemId;
string publicId;
ParseExternalId(token, Token.EntityDecl, out publicId, out systemId);
entity.IsExternal = true;
entity.Url = systemId;
entity.Pubid = publicId;
if (GetToken(false) == Token.NData)
{
if (isParamEntity)
{
ThrowUnexpectedToken(_curPos - 5, ">"); // 5 == strlen("NDATA")
}
if (!_whitespaceSeen)
{
Throw(_curPos - 5, SR.Xml_ExpectingWhiteSpace, "NDATA");
}
if (GetToken(true) != Token.Name)
{
goto UnexpectedError;
}
entity.NData = GetNameQualified(false);
#if !SILVERLIGHT
string notationName = entity.NData.Name;
if (!_schemaInfo.Notations.ContainsKey(notationName))
{
AddUndeclaredNotation(notationName);
}
#endif
}
break;
case Token.Literal:
entity.Text = GetValue();
entity.Line = (int)_literalLineInfo.lineNo;
entity.Pos = (int)_literalLineInfo.linePos;
break;
default:
goto UnexpectedError;
}
if (GetToken(false) == Token.GreaterThan)
{
entity.ParsingInProgress = false;
return;
}
UnexpectedError:
OnUnexpectedError();
}