public static string GetStringFromGrammarStringLiteral(string literal)
{
StringBuilder buf = new StringBuilder();
int i = 1; // skip first quote
int n = literal.Length - 1; // skip last quote
while (i < n)
{ // scan all but last quote
int end = i + 1;
if (literal[i] == '\\')
{
end = i + 2;
if (i + 1 < n && literal[i + 1] == 'u')
{
for (end = i + 2; end < i + 6; end++)
{
if (end > n)
return null; // invalid escape sequence.
char charAt = literal[end];
if (!char.IsDigit(charAt) && !(charAt >= 'a' && charAt <= 'f') && !(charAt >= 'A' && charAt <= 'F'))
{
return null; // invalid escape sequence.
}
}
}
}
if (end > n)
return null; // invalid escape sequence.
string esc = literal.Substring(i, end - i);
int c = GetCharValueFromCharInGrammarLiteral(esc);
if (c == -1)
{
return null; // invalid escape sequence.
}
else
buf.Append((char)c);
i = end;
}
return buf.ToString();
}