internal virtual int GetNextXMLToken()
{
tokenBeg = cursor;
stringBufferTop = 0;
// remember the XML
for (int c = GetChar(); c != EOF_CHAR; c = GetChar())
{
if (xmlIsTagContent)
{
switch (c)
{
case '>':
{
AddToString(c);
xmlIsTagContent = false;
xmlIsAttribute = false;
break;
}
case '/':
{
AddToString(c);
if (PeekChar() == '>')
{
c = GetChar();
AddToString(c);
xmlIsTagContent = false;
xmlOpenTagsCount--;
}
break;
}
case '{':
{
UngetChar(c);
this.@string = GetStringFromBuffer();
return Token.XML;
}
case '\'':
case '"':
{
AddToString(c);
if (!ReadQuotedString(c))
{
return Token.ERROR;
}
break;
}
case '=':
{
AddToString(c);
xmlIsAttribute = true;
break;
}
case ' ':
case '\t':
case '\r':
case '\n':
{
AddToString(c);
break;
}
default:
{
AddToString(c);
xmlIsAttribute = false;
break;
}
}
if (!xmlIsTagContent && xmlOpenTagsCount == 0)
{
this.@string = GetStringFromBuffer();
return Token.XMLEND;
}
}
else
{
switch (c)
{
case '<':
{
AddToString(c);
c = PeekChar();
switch (c)
{
case '!':
{
c = GetChar();
// Skip !
AddToString(c);
c = PeekChar();
switch (c)
{
case '-':
{
c = GetChar();
// Skip -
AddToString(c);
c = GetChar();
if (c == '-')
{
AddToString(c);
if (!ReadXmlComment())
{
return Token.ERROR;
}
}
else
{
// throw away the string in progress
stringBufferTop = 0;
this.@string = null;
parser.AddError("msg.XML.bad.form");
return Token.ERROR;
}
break;
}
case '[':
{
c = GetChar();
// Skip [
AddToString(c);
if (GetChar() == 'C' && GetChar() == 'D' && GetChar() == 'A' && GetChar() == 'T' && GetChar() == 'A' && GetChar() == '[')
{
AddToString('C');
AddToString('D');
AddToString('A');
AddToString('T');
AddToString('A');
AddToString('[');
if (!ReadCDATA())
{
return Token.ERROR;
}
}
else
{
// throw away the string in progress
stringBufferTop = 0;
this.@string = null;
parser.AddError("msg.XML.bad.form");
return Token.ERROR;
}
break;
}
default:
{
if (!ReadEntity())
{
return Token.ERROR;
}
break;
}
}
break;
}
case '?':
{
c = GetChar();
// Skip ?
AddToString(c);
if (!ReadPI())
{
return Token.ERROR;
}
break;
}
case '/':
{
// End tag
c = GetChar();
// Skip /
AddToString(c);
if (xmlOpenTagsCount == 0)
{
// throw away the string in progress
stringBufferTop = 0;
this.@string = null;
parser.AddError("msg.XML.bad.form");
return Token.ERROR;
}
xmlIsTagContent = true;
xmlOpenTagsCount--;
break;
}
default:
{
// Start tag
xmlIsTagContent = true;
xmlOpenTagsCount++;
break;
}
}
break;
}
case '{':
{
UngetChar(c);
this.@string = GetStringFromBuffer();
return Token.XML;
}
default:
{
AddToString(c);
break;
}
}
}
}
tokenEnd = cursor;
stringBufferTop = 0;
// throw away the string in progress
this.@string = null;
parser.AddError("msg.XML.bad.form");
return Token.ERROR;
}