示例#1
0
        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
            }
        }
示例#3
0
        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);
            }
        }