private EntityType HandleEntityReference(bool isInAttributeValue, EntityExpandType expandType, out int charRefEndPos) { Debug.Assert(_ps.chars[_ps.charPos] == '&'); if (_ps.charPos + 1 == _ps.charsUsed) { if (ReadData() == 0) { Throw(SR.Xml_UnexpectedEOF1); } } // numeric characters reference if (_ps.chars[_ps.charPos + 1] == '#') { EntityType entityType; charRefEndPos = ParseNumericCharRef(expandType != EntityExpandType.OnlyGeneral, null, out entityType); Debug.Assert(entityType == EntityType.CharacterDec || entityType == EntityType.CharacterHex); return entityType; } // named reference else { // named character reference charRefEndPos = ParseNamedCharRef(expandType != EntityExpandType.OnlyGeneral, null); if (charRefEndPos >= 0) { return EntityType.CharacterNamed; } // general entity reference // NOTE: XmlValidatingReader compatibility mode: expand all entities in attribute values // general entity reference if (expandType == EntityExpandType.OnlyCharacter || (_entityHandling != EntityHandling.ExpandEntities && (!isInAttributeValue || !_validatingReaderCompatFlag))) { return EntityType.Unexpanded; } int endPos; _ps.charPos++; int savedLinePos = _ps.LinePos; try { endPos = ParseName(); } catch (XmlException) { Throw(SR.Xml_ErrorParsingEntityName, _ps.LineNo, savedLinePos); return EntityType.Skipped; } // check ';' if (_ps.chars[endPos] != ';') { ThrowUnexpectedToken(endPos, ";"); } int entityLinePos = _ps.LinePos; string entityName = _nameTable.Add(_ps.chars, _ps.charPos, endPos - _ps.charPos); _ps.charPos = endPos + 1; charRefEndPos = -1; EntityType entType = HandleGeneralEntityReference(entityName, isInAttributeValue, false, entityLinePos); _reportedBaseUri = _ps.baseUriStr; _reportedEncoding = _ps.encoding; return entType; } }
private async Task<ValueTuple<int, EntityType>> HandleEntityReferenceAsync(bool isInAttributeValue, EntityExpandType expandType) { int charRefEndPos; Debug.Assert(_ps.chars[_ps.charPos] == '&'); if (_ps.charPos + 1 == _ps.charsUsed) { if (await ReadDataAsync().ConfigureAwait(false) == 0) { Throw(SR.Xml_UnexpectedEOF1); } } // numeric characters reference if (_ps.chars[_ps.charPos + 1] == '#') { EntityType entityType; var tuple_17 = await ParseNumericCharRefAsync(expandType != EntityExpandType.OnlyGeneral, null).ConfigureAwait(false); entityType = tuple_17.Item1; charRefEndPos = tuple_17.Item2; Debug.Assert(entityType == EntityType.CharacterDec || entityType == EntityType.CharacterHex); return new ValueTuple<int, EntityType>(charRefEndPos, entityType); } // named reference else { // named character reference charRefEndPos = await ParseNamedCharRefAsync(expandType != EntityExpandType.OnlyGeneral, null).ConfigureAwait(false); if (charRefEndPos >= 0) { return new ValueTuple<int, EntityType>(charRefEndPos, EntityType.CharacterNamed); } // general entity reference int endPos; _ps.charPos++; int savedLinePos = _ps.LinePos; try { endPos = await ParseNameAsync().ConfigureAwait(false); } catch (XmlException) { Throw(SR.Xml_ErrorParsingEntityName, _ps.LineNo, savedLinePos); return new ValueTuple<int, EntityType>(charRefEndPos, EntityType.Skipped); } // check ';' if (_ps.chars[endPos] != ';') { ThrowUnexpectedToken(endPos, ";"); } int entityLinePos = _ps.LinePos; string entityName = _nameTable.Add(_ps.chars, _ps.charPos, endPos - _ps.charPos); _ps.charPos = endPos + 1; charRefEndPos = -1; Throw(SR.Xml_UndeclaredEntity, entityName, _ps.LineNo, entityLinePos); return default(ValueTuple<int, EntityType>);//unreachable } }
private EntityType HandleEntityReference(bool isInAttributeValue, EntityExpandType expandType, out int charRefEndPos) { Debug.Assert(ps.chars[ps.charPos] == '&'); if (ps.charPos + 1 == ps.charsUsed) { if (ReadData() == 0) { Throw(Res.Xml_UnexpectedEOF1); } } // numeric characters reference if (ps.chars[ps.charPos + 1] == '#') { EntityType entityType; charRefEndPos = ParseNumericCharRef(expandType != EntityExpandType.OnlyGeneral, null, out entityType); Debug.Assert(entityType == EntityType.CharacterDec || entityType == EntityType.CharacterHex); return entityType; } // named reference else { // named character reference charRefEndPos = ParseNamedCharRef(expandType != EntityExpandType.OnlyGeneral, null); if (charRefEndPos >= 0) { return EntityType.CharacterNamed; } return EntityType.Unexpanded; } }
private async Task<ValueTuple<int, EntityType>> HandleEntityReferenceAsync(bool isInAttributeValue, EntityExpandType expandType) { int charRefEndPos; Debug.Assert(_ps.chars[_ps.charPos] == '&'); if (_ps.charPos + 1 == _ps.charsUsed) { if (await ReadDataAsync().ConfigureAwait(false) == 0) { Throw(SR.Xml_UnexpectedEOF1); } } // numeric characters reference if (_ps.chars[_ps.charPos + 1] == '#') { EntityType entityType; var tuple_17 = await ParseNumericCharRefAsync(expandType != EntityExpandType.OnlyGeneral, null).ConfigureAwait(false); entityType = tuple_17.Item1; charRefEndPos = tuple_17.Item2; Debug.Assert(entityType == EntityType.CharacterDec || entityType == EntityType.CharacterHex); return new ValueTuple<int, EntityType>(charRefEndPos, entityType); } // named reference else { // named character reference charRefEndPos = await ParseNamedCharRefAsync(expandType != EntityExpandType.OnlyGeneral, null).ConfigureAwait(false); if (charRefEndPos >= 0) { return new ValueTuple<int, EntityType>(charRefEndPos, EntityType.CharacterNamed); } // general entity reference #if !SILVERLIGHT // Needed only for XmlTextReader (reporting of entities) // NOTE: XmlValidatingReader compatibility mode: expand all entities in attribute values // general entity reference if (expandType == EntityExpandType.OnlyCharacter || (_entityHandling != EntityHandling.ExpandEntities && (!isInAttributeValue || !_validatingReaderCompatFlag))) { return new ValueTuple<int, EntityType>(charRefEndPos, EntityType.Unexpanded); } #endif int endPos; _ps.charPos++; int savedLinePos = _ps.LinePos; try { endPos = await ParseNameAsync().ConfigureAwait(false); } catch (XmlException) { Throw(SR.Xml_ErrorParsingEntityName, _ps.LineNo, savedLinePos); return new ValueTuple<int, EntityType>(charRefEndPos, EntityType.Skipped); } // check ';' if (_ps.chars[endPos] != ';') { ThrowUnexpectedToken(endPos, ";"); } int entityLinePos = _ps.LinePos; string entityName = _nameTable.Add(_ps.chars, _ps.charPos, endPos - _ps.charPos); _ps.charPos = endPos + 1; charRefEndPos = -1; EntityType entType = await HandleGeneralEntityReferenceAsync(entityName, isInAttributeValue, false, entityLinePos).ConfigureAwait(false); _reportedBaseUri = _ps.baseUriStr; _reportedEncoding = _ps.encoding; return new ValueTuple<int, EntityType>(charRefEndPos, entType); } }