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

◆ Encode()

OperationStatus System.Text.Encodings.Web.OptimizedInboxTextEncoder.Encode ( ReadOnlySpan< char > source,
Span< char > destination,
out int charsConsumed,
out int charsWritten,
bool isFinalBlock )
inline

Definition at line 161 of file OptimizedInboxTextEncoder.cs.

162 {
164 int num = 0;
165 int num2 = 0;
166 OperationStatus result2;
167 while (true)
168 {
169 int num3;
170 Rune result;
171 if (SpanUtility.IsValidIndex(source, num))
172 {
173 char c = source[num];
174 if (_asciiPreescapedData.TryGetPreescapedData(c, out var preescapedData))
175 {
176 if (SpanUtility.IsValidIndex(destination, num2))
177 {
178 destination[num2] = (char)(byte)preescapedData;
179 if (((int)preescapedData & 0xFF00) == 0)
180 {
181 num2++;
182 num++;
183 continue;
184 }
185 preescapedData >>= 8;
186 num3 = num2 + 1;
187 while (SpanUtility.IsValidIndex(destination, num3))
188 {
189 destination[num3++] = (char)(byte)preescapedData;
190 if ((byte)(preescapedData >>= 8) != 0)
191 {
192 continue;
193 }
194 goto IL_0091;
195 }
196 }
197 goto IL_0148;
198 }
199 if (Rune.TryCreate(c, out result))
200 {
201 goto IL_00e1;
202 }
203 int index = num + 1;
204 if (SpanUtility.IsValidIndex(source, index))
205 {
206 if (Rune.TryCreate(c, source[index], out result))
207 {
208 goto IL_00e1;
209 }
210 }
211 else if (!isFinalBlock && char.IsHighSurrogate(c))
212 {
213 result2 = OperationStatus.NeedMoreData;
214 break;
215 }
216 result = Rune.ReplacementChar;
217 goto IL_010d;
218 }
219 result2 = OperationStatus.Done;
220 break;
221 IL_0148:
222 result2 = OperationStatus.DestinationTooSmall;
223 break;
224 IL_0091:
225 num2 = num3;
226 num++;
227 continue;
228 IL_010d:
229 int num4 = _scalarEscaper.EncodeUtf16(result, destination.Slice(num2));
230 if (num4 >= 0)
231 {
232 num2 += num4;
233 num += result.Utf16SequenceLength;
234 continue;
235 }
236 goto IL_0148;
237 IL_00e1:
238 if (!IsScalarValueAllowed(result))
239 {
240 goto IL_010d;
241 }
242 if (result.TryEncodeToUtf16(destination.Slice(num2), out var charsWritten2))
243 {
244 num2 += charsWritten2;
245 num += charsWritten2;
246 continue;
247 }
248 goto IL_0148;
249 }
250 charsConsumed = num;
251 charsWritten = num2;
252 return result2;
253 }
int EncodeUtf16(Rune value, Span< char > destination)
unsafe readonly bool TryGetPreescapedData(uint codePoint, out ulong preescapedData)

References System.Text.Encodings.Web.OptimizedInboxTextEncoder._asciiPreescapedData, System.Text.Encodings.Web.OptimizedInboxTextEncoder._AssertThisNotNull(), System.Text.Encodings.Web.OptimizedInboxTextEncoder._scalarEscaper, System.destination, System.Text.Encodings.Web.ScalarEscaperBase.EncodeUtf16(), System.index, System.Text.Encodings.Web.OptimizedInboxTextEncoder.IsScalarValueAllowed(), System.Text.Rune.ReplacementChar, System.source, System.Text.Rune.TryCreate(), System.Text.Rune.TryEncodeToUtf16(), System.Text.Encodings.Web.OptimizedInboxTextEncoder.AsciiPreescapedData.TryGetPreescapedData(), and System.Text.Rune.Utf16SequenceLength.

Referenced by System.Text.Encodings.Web.DefaultHtmlEncoder.EncodeCore(), System.Text.Encodings.Web.DefaultJavaScriptEncoder.EncodeCore(), and System.Text.Encodings.Web.DefaultUrlEncoder.EncodeCore().