private static JsonToken GetStringToken(JsonBuffer buffer, char quoteCharacter)
{
// opening quote has already been read
var start = buffer.Position - 1;
var sb = new StringBuilder();
while (true)
{
var c = buffer.Read();
switch (c)
{
case '\\':
c = buffer.Read();
switch (c)
{
case '\'': sb.Append('\''); break;
case '"': sb.Append('"'); break;
case '\\': sb.Append('\\'); break;
case '/': sb.Append('/'); break;
case 'b': sb.Append('\b'); break;
case 'f': sb.Append('\f'); break;
case 'n': sb.Append('\n'); break;
case 'r': sb.Append('\r'); break;
case 't': sb.Append('\t'); break;
case 'u':
var u1 = buffer.Read();
var u2 = buffer.Read();
var u3 = buffer.Read();
var u4 = buffer.Read();
if (u4 != -1)
{
var hex = new string(new char[] { (char)u1, (char)u2, (char)u3, (char)u4 });
var n = Convert.ToInt32(hex, 16);
sb.Append((char)n);
}
break;
default:
if (c != -1)
{
var message = string.Format("Invalid escape sequence in JSON string '\\{0}'.", (char)c);
throw new Exception(message);
}
break;
}
break;
default:
if (c == quoteCharacter)
{
var lexeme = buffer.Substring(start, buffer.Position - start);
return new StringJsonToken(JsonTokenType.String, lexeme, sb.ToString());
}
if (c != -1)
{
sb.Append((char)c);
}
break;
}
if (c == -1)
{
throw new Exception(FormatMessage("End of file in JSON string.", buffer, start));
}
}
}