Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
DefaultUrlEncoder.cs
Go to the documentation of this file.
3
5
6internal sealed class DefaultUrlEncoder : UrlEncoder
7{
9 {
10 internal static readonly EscaperImplementation Singleton = new EscaperImplementation();
11
13 {
14 }
15
16 internal override int EncodeUtf8(Rune value, Span<byte> destination)
17 {
18 uint utf8RepresentationForScalarValue = (uint)UnicodeHelpers.GetUtf8RepresentationForScalarValue((uint)value.Value);
19 if (SpanUtility.IsValidIndex(destination, 2))
20 {
21 destination[0] = 37;
22 System.HexConverter.ToBytesBuffer((byte)utf8RepresentationForScalarValue, destination, 1);
23 if ((utf8RepresentationForScalarValue >>= 8) == 0)
24 {
25 return 3;
26 }
27 if (SpanUtility.IsValidIndex(destination, 5))
28 {
29 destination[3] = 37;
30 System.HexConverter.ToBytesBuffer((byte)utf8RepresentationForScalarValue, destination, 4);
31 if ((utf8RepresentationForScalarValue >>= 8) == 0)
32 {
33 return 6;
34 }
35 if (SpanUtility.IsValidIndex(destination, 8))
36 {
37 destination[6] = 37;
38 System.HexConverter.ToBytesBuffer((byte)utf8RepresentationForScalarValue, destination, 7);
39 if ((utf8RepresentationForScalarValue >>= 8) == 0)
40 {
41 return 9;
42 }
43 if (SpanUtility.IsValidIndex(destination, 11))
44 {
45 destination[9] = 37;
46 System.HexConverter.ToBytesBuffer((byte)utf8RepresentationForScalarValue, destination, 10);
47 return 12;
48 }
49 }
50 }
51 }
52 return -1;
53 }
54
56 {
57 uint utf8RepresentationForScalarValue = (uint)UnicodeHelpers.GetUtf8RepresentationForScalarValue((uint)value.Value);
58 if (SpanUtility.IsValidIndex(destination, 2))
59 {
60 destination[0] = '%';
61 System.HexConverter.ToCharsBuffer((byte)utf8RepresentationForScalarValue, destination, 1);
62 if ((utf8RepresentationForScalarValue >>= 8) == 0)
63 {
64 return 3;
65 }
66 if (SpanUtility.IsValidIndex(destination, 5))
67 {
68 destination[3] = '%';
69 System.HexConverter.ToCharsBuffer((byte)utf8RepresentationForScalarValue, destination, 4);
70 if ((utf8RepresentationForScalarValue >>= 8) == 0)
71 {
72 return 6;
73 }
74 if (SpanUtility.IsValidIndex(destination, 8))
75 {
76 destination[6] = '%';
77 System.HexConverter.ToCharsBuffer((byte)utf8RepresentationForScalarValue, destination, 7);
78 if ((utf8RepresentationForScalarValue >>= 8) == 0)
79 {
80 return 9;
81 }
82 if (SpanUtility.IsValidIndex(destination, 11))
83 {
84 destination[9] = '%';
85 System.HexConverter.ToCharsBuffer((byte)utf8RepresentationForScalarValue, destination, 10);
86 return 12;
87 }
88 }
89 }
90 }
91 return -1;
92 }
93 }
94
96
98
99 public override int MaxOutputCharactersPerInputCharacter => 9;
100
102 {
103 if (settings == null)
104 {
105 throw new ArgumentNullException("settings");
106 }
108 ref readonly AllowedBmpCodePointsBitmap allowedCodePointsBitmap = ref settings.GetAllowedCodePointsBitmap();
109 Span<char> span = stackalloc char[31]
110 {
111 ' ', '#', '%', '/', ':', '=', '?', '[', '\\', ']',
112 '^', '`', '{', '|', '}', '\ufff0', '\ufff1', '\ufff2', '\ufff3', '\ufff4',
113 '\ufff5', '\ufff6', '\ufff7', '\ufff8', '\ufff9', '\ufffa', '\ufffb', '', '\ufffd', '\ufffe',
114 '\uffff'
115 };
116 _innerEncoder = new OptimizedInboxTextEncoder(singleton, in allowedCodePointsBitmap, forbidHtmlSensitiveCharacters: true, span);
117 }
118
119 private protected override OperationStatus EncodeCore(ReadOnlySpan<char> source, Span<char> destination, out int charsConsumed, out int charsWritten, bool isFinalBlock)
120 {
121 return _innerEncoder.Encode(source, destination, out charsConsumed, out charsWritten, isFinalBlock);
122 }
123
124 private protected override OperationStatus EncodeUtf8Core(ReadOnlySpan<byte> utf8Source, Span<byte> utf8Destination, out int bytesConsumed, out int bytesWritten, bool isFinalBlock)
125 {
126 return _innerEncoder.EncodeUtf8(utf8Source, utf8Destination, out bytesConsumed, out bytesWritten, isFinalBlock);
127 }
128
129 private protected override int FindFirstCharacterToEncode(ReadOnlySpan<char> text)
130 {
132 }
133
134 public unsafe override int FindFirstCharacterToEncode(char* text, int textLength)
135 {
137 }
138
140 {
142 }
143
144 public unsafe override bool TryEncodeUnicodeScalar(int unicodeScalar, char* buffer, int bufferLength, out int numberOfCharactersWritten)
145 {
146 return _innerEncoder.TryEncodeUnicodeScalar(unicodeScalar, buffer, bufferLength, out numberOfCharactersWritten);
147 }
148
149 public override bool WillEncode(int unicodeScalar)
150 {
151 return !_innerEncoder.IsScalarValueAllowed(new Rune(unicodeScalar));
152 }
153}
static void ToCharsBuffer(byte value, Span< char > buffer, int startingIndex=0, Casing casing=Casing.Upper)
static void ToBytesBuffer(byte value, Span< byte > buffer, int startingIndex=0, Casing casing=Casing.Upper)
override int EncodeUtf8(Rune value, Span< byte > destination)
override int EncodeUtf16(Rune value, Span< char > destination)
unsafe override bool TryEncodeUnicodeScalar(int unicodeScalar, char *buffer, int bufferLength, out int numberOfCharactersWritten)
override bool WillEncode(int unicodeScalar)
unsafe override int FindFirstCharacterToEncode(char *text, int textLength)
override int FindFirstCharacterToEncodeUtf8(ReadOnlySpan< byte > utf8Text)
DefaultUrlEncoder(TextEncoderSettings settings)
readonly OptimizedInboxTextEncoder _innerEncoder
override OperationStatus EncodeCore(ReadOnlySpan< char > source, Span< char > destination, out int charsConsumed, out int charsWritten, bool isFinalBlock)
static readonly DefaultUrlEncoder BasicLatinSingleton
override int FindFirstCharacterToEncode(ReadOnlySpan< char > text)
override OperationStatus EncodeUtf8Core(ReadOnlySpan< byte > utf8Source, Span< byte > utf8Destination, out int bytesConsumed, out int bytesWritten, bool isFinalBlock)
OperationStatus Encode(ReadOnlySpan< char > source, Span< char > destination, out int charsConsumed, out int charsWritten, bool isFinalBlock)
unsafe bool TryEncodeUnicodeScalar(int unicodeScalar, char *buffer, int bufferLength, out int numberOfCharactersWritten)
unsafe int GetIndexOfFirstByteToEncode(ReadOnlySpan< byte > data)
unsafe int GetIndexOfFirstCharToEncode(ReadOnlySpan< char > data)
unsafe int FindFirstCharacterToEncode(char *text, int textLength)
OperationStatus EncodeUtf8(ReadOnlySpan< byte > source, Span< byte > destination, out int bytesConsumed, out int bytesWritten, bool isFinalBlock)
ref readonly AllowedBmpCodePointsBitmap GetAllowedCodePointsBitmap()
static int GetUtf8RepresentationForScalarValue(uint scalar)