static string EscapeStringLiteral (string input)
{
StringBuilder sb = null;
int i = 0, start = 0;
for (; i < input.Length; i++) {
switch (input [i]) {
case '"':
AppendBuffer (ref sb, input, start, i, @"\""");
break;
case '\\':
AppendBuffer (ref sb, input, start, i, @"\\");
break;
case '/':
AppendBuffer (ref sb, input, start, i, @"\/");
break;
case '\x8':
AppendBuffer (ref sb, input, start, i, @"\b");
break;
case '\f':
AppendBuffer (ref sb, input, start, i, @"\f");
break;
case '\n':
AppendBuffer (ref sb, input, start, i, /*@"\n"*/@"\u000a");
break;
case '\r':
AppendBuffer (ref sb, input, start, i, /*@"\r"*/@"\u000d");
break;
case '\t':
AppendBuffer (ref sb, input, start, i, /*@"\t"*/@"\u0009");
break;
default:
continue;
}
start = i + 1;
}
string remaining = input.Substring (start, i - start);
if (sb != null)
return sb.Append (remaining).ToString ();
else
return remaining;
}