internal SyntaxToken ScanXmlCData()
{
SyntaxList<SyntaxNode> precedingTrivia = null;
var scratch = GetScratch();
var Here = 0;
while (CanGetCharAtOffset(Here))
{
char c = PeekAheadChar(Here);
switch (c)
{
case UCH_CR:
case UCH_LF:
Here = SkipLineBreak(c, Here);
scratch.Append(UCH_LF);
return XmlMakeCDataToken(precedingTrivia, Here, scratch);
case ']':
if (CanGetCharAtOffset(Here + 2) && PeekAheadChar(Here + 1) == ']' && PeekAheadChar(Here + 2) == '>')
{
//// If valid characters found then return them.
if (Here != 0)
{
return XmlMakeCDataToken(precedingTrivia, Here, scratch);
}
return XmlMakeEndCDataToken(precedingTrivia);
}
goto ScanChars;
default:
ScanChars:
var xmlCh = ScanXmlChar(Here);
if (xmlCh.Length == 0)
{
// bad char
if (Here > 0)
{
return XmlMakeCDataToken(precedingTrivia, Here, scratch);
}
else
{
return XmlMakeBadToken(precedingTrivia, 1, ERRID.ERR_IllegalChar);
}
}
xmlCh.AppendTo(scratch);
Here += xmlCh.Length;
break;
}
}
// no more chars
if (Here > 0)
{
return XmlMakeCDataToken(precedingTrivia, Here, scratch);
}
else
{
return MakeEofToken(precedingTrivia);
}
}