Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches

◆ EscapeStringToBuilder()

static void System.UriHelper.EscapeStringToBuilder ( ReadOnlySpan< char > stringToEscape,
ref System::Text::ValueStringBuilder vsb,
ReadOnlySpan< bool > noEscape,
bool checkExistingEscaped )
inlinestaticprivate

Definition at line 195 of file UriHelper.cs.

196 {
197 Span<byte> destination = stackalloc byte[4];
198 SpanRuneEnumerator spanRuneEnumerator = stringToEscape.EnumerateRunes();
199 while (spanRuneEnumerator.MoveNext())
200 {
201 Rune current = spanRuneEnumerator.Current;
202 if (!current.IsAscii)
203 {
204 current.TryEncodeToUtf8(destination, out var bytesWritten);
205 Span<byte> span = destination.Slice(0, bytesWritten);
206 for (int i = 0; i < span.Length; i++)
207 {
208 byte value = span[i];
209 vsb.Append('%');
210 System.HexConverter.ToCharsBuffer(value, vsb.AppendSpan(2));
211 }
212 continue;
213 }
214 byte b = (byte)current.Value;
215 if (noEscape[b])
216 {
217 vsb.Append((char)b);
218 continue;
219 }
220 if (checkExistingEscaped && b == 37)
221 {
222 SpanRuneEnumerator spanRuneEnumerator2 = spanRuneEnumerator;
223 if (spanRuneEnumerator2.MoveNext())
224 {
225 Rune current2 = spanRuneEnumerator2.Current;
226 if (current2.IsAscii && IsHexDigit((char)current2.Value) && spanRuneEnumerator2.MoveNext())
227 {
228 Rune current3 = spanRuneEnumerator2.Current;
229 if (current3.IsAscii && IsHexDigit((char)current3.Value))
230 {
231 vsb.Append('%');
232 vsb.Append((char)current2.Value);
233 vsb.Append((char)current3.Value);
234 spanRuneEnumerator = spanRuneEnumerator2;
235 continue;
236 }
237 }
238 }
239 }
240 vsb.Append('%');
241 System.HexConverter.ToCharsBuffer(b, vsb.AppendSpan(2));
242 }
243 }
static void ToCharsBuffer(byte value, Span< char > buffer, int startingIndex=0, Casing casing=Casing.Upper)
static bool IsHexDigit(char character)
Definition UriHelper.cs:471
bool IsAscii
Definition Rune.cs:47
bool TryEncodeToUtf8(Span< byte > destination, out int bytesWritten)
Definition Rune.cs:580

References System.Text.SpanRuneEnumerator.Current, System.destination, System.Text.Rune.IsAscii, System.UriHelper.IsHexDigit(), System.Span< T >.Length, System.Text.SpanRuneEnumerator.MoveNext(), System.Span< T >.Slice(), System.HexConverter.ToCharsBuffer(), System.Text.Rune.TryEncodeToUtf8(), System.Text.Rune.Value, and System.value.

Referenced by System.UriHelper.EscapeString(), and System.UriHelper.EscapeString().