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

◆ EncodeUtf8()

OperationStatus System.Text.Encodings.Web.OptimizedInboxTextEncoder.EncodeUtf8 ( ReadOnlySpan< byte > source,
Span< byte > destination,
out int bytesConsumed,
out int bytesWritten,
bool isFinalBlock )
inline

Definition at line 255 of file OptimizedInboxTextEncoder.cs.

256 {
258 int num = 0;
259 int num2 = 0;
260 OperationStatus result2;
261 while (true)
262 {
263 int num3;
264 if (SpanUtility.IsValidIndex(source, num))
265 {
266 uint codePoint = source[num];
267 if (_asciiPreescapedData.TryGetPreescapedData(codePoint, out var preescapedData))
268 {
269 if (SpanUtility.TryWriteUInt64LittleEndian(destination, num2, preescapedData))
270 {
271 num2 += (int)(preescapedData >> 56);
272 num++;
273 continue;
274 }
275 num3 = num2;
276 while (SpanUtility.IsValidIndex(destination, num3))
277 {
278 destination[num3++] = (byte)preescapedData;
279 if ((byte)(preescapedData >>= 8) != 0)
280 {
281 continue;
282 }
283 goto IL_0076;
284 }
285 }
286 else
287 {
288 Rune result;
289 int bytesConsumed2;
290 OperationStatus operationStatus = Rune.DecodeFromUtf8(source.Slice(num), out result, out bytesConsumed2);
291 if (operationStatus != 0)
292 {
293 if (!isFinalBlock && operationStatus == OperationStatus.NeedMoreData)
294 {
295 result2 = OperationStatus.NeedMoreData;
296 break;
297 }
298 }
299 else if (IsScalarValueAllowed(result))
300 {
301 if (result.TryEncodeToUtf8(destination.Slice(num2), out var bytesWritten2))
302 {
303 num2 += bytesWritten2;
304 num += bytesWritten2;
305 continue;
306 }
307 goto IL_0103;
308 }
309 int num4 = _scalarEscaper.EncodeUtf8(result, destination.Slice(num2));
310 if (num4 >= 0)
311 {
312 num2 += num4;
313 num += bytesConsumed2;
314 continue;
315 }
316 }
317 goto IL_0103;
318 }
319 result2 = OperationStatus.Done;
320 break;
321 IL_0076:
322 num2 = num3;
323 num++;
324 continue;
325 IL_0103:
326 result2 = OperationStatus.DestinationTooSmall;
327 break;
328 }
329 bytesConsumed = num;
330 bytesWritten = num2;
331 return result2;
332 }
int EncodeUtf8(Rune value, Span< byte > 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.codePoint, System.Text.Rune.DecodeFromUtf8(), System.destination, System.Text.Encodings.Web.ScalarEscaperBase.EncodeUtf8(), System.Text.Encodings.Web.OptimizedInboxTextEncoder.IsScalarValueAllowed(), System.source, System.Text.Rune.TryEncodeToUtf8(), System.Text.Encodings.Web.OptimizedInboxTextEncoder.AsciiPreescapedData.TryGetPreescapedData(), and System.Text.Encodings.Web.SpanUtility.TryWriteUInt64LittleEndian().

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