public static JsonToken Parse(JsonReaderBuffer buffer, JsonTokenType textOrProperty) { char character; bool escaped = false; int start = buffer.Offset + 1; int length = 0; Action forward = () => { ForwardOrThrow(buffer, true); length++; }; ForwardOrThrow(buffer, true); while (buffer.Data[buffer.Offset] != '"') { if (buffer.Data[buffer.Offset] != '\\') { forward(); continue; } escaped = true; forward(); character = buffer.Data[buffer.Offset]; switch (character) { case 'n': case 't': case 'r': case 'b': case 'f': case '/': case '\\': case '\"': forward(); continue; } if (character != 'u') throw new JsonReaderSyntaxException(); for (int i = 0; i < 4; i++) { forward(); character = buffer.Data[buffer.Offset]; if ('0' <= character && character <= '9') continue; if ('a' <= character && character <= 'f') continue; throw new JsonReaderSyntaxException(); } forward(); continue; } buffer.Forward(true); if (escaped) return new EscapingToken(textOrProperty, buffer.Data, start, length); return new DataToken(textOrProperty, buffer.Data, start, length); }
private static void ForwardOrThrow(JsonReaderBuffer buffer, bool consistent) { if (buffer.Forward(consistent) == false) throw new JsonReaderStreamException(); }
public static JsonToken Parse(JsonReaderBuffer buffer) { bool isReal = false; bool isNegative = false; bool isScientific = false; int start = buffer.Offset; int length = 0; Action forward = () => { if (buffer.Forward(true) == false) throw new JsonReaderStreamException(); length++; }; Func<bool> tryForward = () => { length++; return buffer.Forward(true); }; if (buffer.Data[buffer.Offset] == '-') { isNegative = true; forward(); } if (buffer.Data[buffer.Offset] == '0') { tryForward(); } else if (Char.IsDigit(buffer.Data[buffer.Offset])) { while (Char.IsDigit(buffer.Data[buffer.Offset])) if (tryForward() == false) break; } else throw new JsonReaderSyntaxException(); if (buffer.Ensure(true)) { if (buffer.Data[buffer.Offset] == '.') { forward(); isReal = true; if (Char.IsDigit(buffer.Data[buffer.Offset]) == false) throw new JsonReaderSyntaxException(); while (Char.IsDigit(buffer.Data[buffer.Offset])) if (tryForward() == false) break; } if (buffer.Ensure(true)) { if (buffer.Data[buffer.Offset] == 'e' || buffer.Data[buffer.Offset] == 'E') { forward(); isScientific = true; if (buffer.Data[buffer.Offset] == '-' || buffer.Data[buffer.Offset] == '+') { forward(); } while (Char.IsDigit(buffer.Data[buffer.Offset])) if (tryForward() == false) break; } } } if (length == 0) throw new JsonReaderSyntaxException(); return new DataToken(JsonTokenType.Number, buffer.Data, start, length); }