internal static string Unescape(string Text) {
System.Text.StringBuilder Builder = new System.Text.StringBuilder(Text.Length);
int Start = 0;
for (int i = 0; i < Text.Length; i++) {
if (Text[i] == '\\') {
Builder.Append(Text, Start, i - Start);
if (i + 1 <= Text.Length) {
switch (Text[i + 1]) {
case 'a': Builder.Append('\a'); break;
case 'b': Builder.Append('\b'); break;
case 't': Builder.Append('\t'); break;
case 'n': Builder.Append('\n'); break;
case 'v': Builder.Append('\v'); break;
case 'f': Builder.Append('\f'); break;
case 'r': Builder.Append('\r'); break;
case 'e': Builder.Append('\x1B'); break;
case 'c':
if (i + 2 < Text.Length) {
int CodePoint = char.ConvertToUtf32(Text, i + 2);
if (CodePoint >= 0x40 & CodePoint <= 0x5F) {
Builder.Append(char.ConvertFromUtf32(CodePoint - 64));
} else if (CodePoint == 0x3F) {
Builder.Append('\x7F');
} else {
Interface.AddMessage(MessageType.Error, false, "Unrecognized control character found in " + Text.Substring(i, 3));
return Text;
} i++;
} else {
Interface.AddMessage(MessageType.Error, false, "Insufficient characters available in " + Text + " to decode control character escape sequence");
return Text;
} break;
case '"': Builder.Append('"'); break;
case '\\': Builder.Append('\\'); break;
case 'x':
if (i + 3 < Text.Length) {
Builder.Append(char.ConvertFromUtf32(Convert.ToInt32(Text.Substring(i + 2, 2), 16)));
i += 2;
} else {
Interface.AddMessage(MessageType.Error, false, "Insufficient characters available in " + Text + " to decode hexadecimal escape sequence.");
return Text;
} break;
case 'u':
if (i + 5 < Text.Length) {
Builder.Append(char.ConvertFromUtf32(Convert.ToInt32(Text.Substring(i + 2, 4), 16)));
i += 4;
} else {
Interface.AddMessage(MessageType.Error, false, "Insufficient characters available in " + Text + " to decode hexadecimal escape sequence.");
return Text;
} break;
default:
Interface.AddMessage(MessageType.Error, false, "Unrecognized escape sequence found in " + Text + ".");
return Text;
}
i++; Start = i + 1;
} else {
Interface.AddMessage(MessageType.Error, false, "Insufficient characters available in " + Text + " to decode escape sequence.");
return Text;
}
}
}
Builder.Append(Text, Start, Text.Length - Start);
return Builder.ToString();
}