private String DiscardEscapeChar(String input)
{
// Create char array to hold unescaped char sequence
char[] output = new char[input.Length];
// The Length of the output can be less than the input
// due to discarded escape chars. This variable holds
// the actual Length of the output
int Length = 0;
// We remember whether the last processed character was
// an escape character
bool lastCharWasEscapeChar = false;
// The multiplier the current unicode digit must be multiplied with.
// E. g. the first digit must be multiplied with 16^3, the second with 16^2...
int codePointMultiplier = 0;
// Used to calculate the codepoint of the escaped unicode character
int codePoint = 0;
for (int i = 0; i < input.Length; i++)
{
char curChar = input[i];
if (codePointMultiplier > 0)
{
codePoint += HexToInt(curChar) * codePointMultiplier;
codePointMultiplier = Number.URShift(codePointMultiplier, 4);
if (codePointMultiplier == 0)
{
output[Length++] = (char)codePoint;
codePoint = 0;
}
}
else if (lastCharWasEscapeChar)
{
if (curChar == 'u')
{
// found an escaped unicode character
codePointMultiplier = 16 * 16 * 16;
}
else
{
// this character was escaped
output[Length] = curChar;
Length++;
}
lastCharWasEscapeChar = false;
}
else
{
if (curChar == '\\')
{
lastCharWasEscapeChar = true;
}
else
{
output[Length] = curChar;
Length++;
}
}
}
if (codePointMultiplier > 0)
{
throw new ParseException("Truncated unicode escape sequence.");
}
if (lastCharWasEscapeChar)
{
throw new ParseException("Term can not end with escape character.");
}
return new String(output, 0, Length);
}