/// <inheritdoc /> public JsonItem ParseNext() { this.state = JsonStringParseState.Start; while (this.state != JsonStringParseState.End) { if (this.Buffer.EndOfStream) { this.MakeEosError('\"'); } switch (this.state) { case JsonStringParseState.Start: if (this.Consume('"')) { this.state = JsonStringParseState.InString; } else { return this.MakeError('"'); } break; case JsonStringParseState.InString: if (this.Consume('\\')) { this.state = JsonStringParseState.Escaping; } else if (this.Consume('"')) { this.state = JsonStringParseState.End; } else if (this.Pop()) { this.stringBuilder.Append(this.OutChar); } break; case JsonStringParseState.InHex: ushort value = 0; for (int i = 0; i < 4; i++) { if (this.Consume(Hex)) { value <<= 4; value |= ushort.Parse(this.OutChar.ToString(CultureInfo.InvariantCulture), NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture); } else { return this.MakeError(Hex); } } this.stringBuilder.Append((char)value); this.state = JsonStringParseState.InString; break; case JsonStringParseState.Escaping: if (this.Consume('"', '\\', '/')) { this.state = JsonStringParseState.InString; this.stringBuilder.Append(this.OutChar); } else if (this.Consume('b', 'f', 'n', 'r', 't', 'u')) { switch (this.OutChar) { case 'b': this.stringBuilder.Append('\b'); this.state = JsonStringParseState.InString; break; case 'f': this.stringBuilder.Append('\f'); this.state = JsonStringParseState.InString; break; case 'n': this.stringBuilder.Append('\n'); this.state = JsonStringParseState.InString; break; case 'r': this.stringBuilder.Append('\r'); this.state = JsonStringParseState.InString; break; case 't': this.stringBuilder.Append('\t'); this.state = JsonStringParseState.InString; break; case 'u': this.state = JsonStringParseState.InHex; break; } } else if (this.Pop()) { this.stringBuilder.Append(this.OutChar); this.state = JsonStringParseState.InString; } else { return this.MakeError('"', '\\', '/', 'b', 'f', 'n', 'r', 't', 'u'); } break; } } return new JsonString(this.stringBuilder.ToString()); }
/// <inheritdoc /> public JsonItem ParseNext() { this.state = JsonStringParseState.Start; while (this.state != JsonStringParseState.End) { if (this.Buffer.EndOfStream) { this.MakeEosError('\"'); } switch (this.state) { case JsonStringParseState.Start: if (this.Consume('"')) { this.state = JsonStringParseState.InString; } else { return(this.MakeError('"')); } break; case JsonStringParseState.InString: if (this.Consume('\\')) { this.state = JsonStringParseState.Escaping; } else if (this.Consume('"')) { this.state = JsonStringParseState.End; } else if (this.Pop()) { this.stringBuilder.Append(this.OutChar); } break; case JsonStringParseState.InHex: ushort value = 0; for (int i = 0; i < 4; i++) { if (this.Consume(Hex)) { value <<= 4; value |= ushort.Parse(this.OutChar.ToString(CultureInfo.InvariantCulture), NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture); } else { return(this.MakeError(Hex)); } } this.stringBuilder.Append((char)value); this.state = JsonStringParseState.InString; break; case JsonStringParseState.Escaping: if (this.Consume('"', '\\', '/')) { this.state = JsonStringParseState.InString; this.stringBuilder.Append(this.OutChar); } else if (this.Consume('b', 'f', 'n', 'r', 't', 'u')) { switch (this.OutChar) { case 'b': this.stringBuilder.Append('\b'); this.state = JsonStringParseState.InString; break; case 'f': this.stringBuilder.Append('\f'); this.state = JsonStringParseState.InString; break; case 'n': this.stringBuilder.Append('\n'); this.state = JsonStringParseState.InString; break; case 'r': this.stringBuilder.Append('\r'); this.state = JsonStringParseState.InString; break; case 't': this.stringBuilder.Append('\t'); this.state = JsonStringParseState.InString; break; case 'u': this.state = JsonStringParseState.InHex; break; } } else if (this.Pop()) { this.stringBuilder.Append(this.OutChar); this.state = JsonStringParseState.InString; } else { return(this.MakeError('"', '\\', '/', 'b', 'f', 'n', 'r', 't', 'u')); } break; } } return(new JsonString(this.stringBuilder.ToString())); }