private string m_literalValue; // the attribute value

		/// <summary>
		/// Attribute objects are reused during parsing to reduce memory allocations, 
		/// hence the Reset method.
		/// </summary>
		public void Reset(string name, string value, char quote)
		{
			this.Name = name;
			this.m_literalValue = value;
			this.QuoteChar = quote;
			this.DtdType = null;
		}
		void ParseAttType(char ch, AttDef attdef)
		{
			if (ch == '%')
			{
				Entity e = ParseParameterEntity(SgmlDtd.WhiteSpace);
				PushEntity(this.m_current.ResolvedUri, e);
				ParseAttType(this.m_current.Lastchar, attdef);
				PopEntity(); // bugbug - are we at the end of the entity?
				ch = this.m_current.Lastchar;
				return;
			}

			if (ch == '(')
			{
				//attdef.EnumValues = ParseNameGroup(ch, false);  
				//attdef.Type = AttributeType.ENUMERATION;
				attdef.SetEnumeratedType(ParseNameGroup(ch, false), AttributeType.ENUMERATION);
			}
			else
			{
				string token = ScanName(SgmlDtd.WhiteSpace);
				if (string.Equals(token, "NOTATION", StringComparison.OrdinalIgnoreCase))
				{
					ch = this.m_current.SkipWhitespace();
					if (ch != '(')
					{
						this.m_current.Error("Expecting name group '(', but found '{0}'", ch);
					}
					//attdef.Type = AttributeType.NOTATION;
					//attdef.EnumValues = ParseNameGroup(ch, true);
					attdef.SetEnumeratedType(ParseNameGroup(ch, true), AttributeType.NOTATION);
				}
				else
				{
					attdef.SetType(token);
				}
			}
		}
		void ParseAttDefault(char ch, AttDef attdef)
		{
			if (ch == '%')
			{
				Entity e = ParseParameterEntity(SgmlDtd.WhiteSpace);
				PushEntity(this.m_current.ResolvedUri, e);
				ParseAttDefault(this.m_current.Lastchar, attdef);
				PopEntity(); // bugbug - are we at the end of the entity?
				ch = this.m_current.Lastchar;
				return;
			}

			bool hasdef = true;
			if (ch == '#')
			{
				this.m_current.ReadChar();
				string token = this.m_current.ScanToken(this.m_sb, SgmlDtd.WhiteSpace, true);
				hasdef = attdef.SetPresence(token);
				ch = this.m_current.SkipWhitespace();
			}
			if (hasdef)
			{
				if (ch == '\'' || ch == '"')
				{
					string lit = this.m_current.ScanLiteral(this.m_sb, ch);
					attdef.Default = lit;
					ch = this.m_current.SkipWhitespace();
				}
				else
				{
					string name = this.m_current.ScanToken(this.m_sb, SgmlDtd.WhiteSpace, false);
					name = name.ToUpperInvariant();
					attdef.Default = name; // bugbug - must be one of the enumerated names.
					ch = this.m_current.SkipWhitespace();
				}
			}
		}
		AttDef ParseAttDef(char ch)
		{
			ch = this.m_current.SkipWhitespace();
			string name = ScanName(SgmlDtd.WhiteSpace);
			name = name.ToUpperInvariant();
			AttDef attdef = new AttDef(name);

			ch = this.m_current.SkipWhitespace();
			if (ch == '-')
				ch = ParseDeclComments();

			ParseAttType(ch, attdef);

			ch = this.m_current.SkipWhitespace();
			if (ch == '-')
				ch = ParseDeclComments();

			ParseAttDefault(ch, attdef);

			ch = this.m_current.SkipWhitespace();
			if (ch == '-')
				ch = ParseDeclComments();

			return attdef;

		}