private static void EscapeString(ReadOnlySpan <char> value, Span <char> destination, JavaScriptEncoder encoder, ref int written) { Debug.Assert(encoder != null); OperationStatus result = encoder.Encode(value, destination, out int encoderBytesConsumed, out int encoderCharsWritten); Debug.Assert(result != OperationStatus.DestinationTooSmall); Debug.Assert(result != OperationStatus.NeedMoreData); if (result != OperationStatus.Done) { ThrowHelper.ThrowArgumentException_InvalidUTF16(value[encoderCharsWritten]); } Debug.Assert(encoderBytesConsumed == value.Length); written += encoderCharsWritten; }
private static void EscapeNextChars(ReadOnlySpan <char> value, int firstChar, Span <char> destination, ref int consumed, ref int written) { int nextChar = -1; if (IsInRangeInclusive(firstChar, JsonConstants.HighSurrogateStartValue, JsonConstants.LowSurrogateEndValue)) { consumed++; if (value.Length <= consumed || firstChar >= JsonConstants.LowSurrogateStartValue) { ThrowHelper.ThrowArgumentException_InvalidUTF16(firstChar); } nextChar = value[consumed]; if (!IsInRangeInclusive(nextChar, JsonConstants.LowSurrogateStartValue, JsonConstants.LowSurrogateEndValue)) { ThrowHelper.ThrowArgumentException_InvalidUTF16(nextChar); } } destination[written++] = '\\'; switch (firstChar) { case JsonConstants.LineFeed: destination[written++] = 'n'; break; case JsonConstants.CarriageReturn: destination[written++] = 'r'; break; case JsonConstants.Tab: destination[written++] = 't'; break; case JsonConstants.BackSlash: destination[written++] = '\\'; break; case JsonConstants.BackSpace: destination[written++] = 'b'; break; case JsonConstants.FormFeed: destination[written++] = 'f'; break; default: destination[written++] = 'u'; #if BUILDING_INBOX_LIBRARY firstChar.TryFormat(destination.Slice(written), out int charsWritten, HexFormatString); Debug.Assert(charsWritten == 4); written += charsWritten; #else written = WriteHex(firstChar, destination, written); #endif if (nextChar != -1) { destination[written++] = '\\'; destination[written++] = 'u'; #if BUILDING_INBOX_LIBRARY nextChar.TryFormat(destination.Slice(written), out charsWritten, HexFormatString); Debug.Assert(charsWritten == 4); written += charsWritten; #else written = WriteHex(nextChar, destination, written); #endif } break; } }