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

◆ FromUtf16()

static unsafe OperationStatus System.Text.Unicode.Utf8.FromUtf16 ( ReadOnlySpan< char > source,
Span< byte > destination,
out int charsRead,
out int bytesWritten,
bool replaceInvalidSequences = true,
bool isFinalBlock = true )
inlinestatic

Definition at line 9 of file Utf8.cs.

10 {
11 _ = source.Length;
12 _ = destination.Length;
13 fixed (char* ptr = &MemoryMarshal.GetReference(source))
14 {
15 fixed (byte* ptr2 = &MemoryMarshal.GetReference(destination))
16 {
17 OperationStatus operationStatus = OperationStatus.Done;
18 char* pInputBufferRemaining = ptr;
19 byte* pOutputBufferRemaining = ptr2;
20 while (!source.IsEmpty)
21 {
22 operationStatus = Utf8Utility.TranscodeToUtf8((char*)Unsafe.AsPointer(ref MemoryMarshal.GetReference(source)), source.Length, (byte*)Unsafe.AsPointer(ref MemoryMarshal.GetReference(destination)), destination.Length, out pInputBufferRemaining, out pOutputBufferRemaining);
23 if (operationStatus <= OperationStatus.DestinationTooSmall || (operationStatus == OperationStatus.NeedMoreData && !isFinalBlock))
24 {
25 break;
26 }
27 if (!replaceInvalidSequences)
28 {
29 operationStatus = OperationStatus.InvalidData;
30 break;
31 }
32 destination = destination.Slice((int)(pOutputBufferRemaining - (byte*)Unsafe.AsPointer(ref MemoryMarshal.GetReference(destination))));
33 if (destination.Length <= 2)
34 {
35 operationStatus = OperationStatus.DestinationTooSmall;
36 break;
37 }
38 destination[0] = 239;
39 destination[1] = 191;
40 destination[2] = 189;
41 destination = destination.Slice(3);
42 source = source.Slice((int)(pInputBufferRemaining - (char*)Unsafe.AsPointer(ref MemoryMarshal.GetReference(source))) + 1);
43 operationStatus = OperationStatus.Done;
44 pInputBufferRemaining = (char*)Unsafe.AsPointer(ref MemoryMarshal.GetReference(source));
45 pOutputBufferRemaining = (byte*)Unsafe.AsPointer(ref MemoryMarshal.GetReference(destination));
46 }
47 charsRead = (int)(pInputBufferRemaining - ptr);
48 bytesWritten = (int)(pOutputBufferRemaining - ptr2);
49 return operationStatus;
50 }
51 }
52 }

References System.destination, System.source, and System.Text.Unicode.Utf8Utility.TranscodeToUtf8().