Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
Utf8.cs
Go to the documentation of this file.
4
5namespace System.Text.Unicode;
6
7public static class Utf8
8{
9 public unsafe static OperationStatus FromUtf16(ReadOnlySpan<char> source, Span<byte> destination, out int charsRead, out int bytesWritten, bool replaceInvalidSequences = true, bool isFinalBlock = true)
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 }
53
54 public unsafe static OperationStatus ToUtf16(ReadOnlySpan<byte> source, Span<char> destination, out int bytesRead, out int charsWritten, bool replaceInvalidSequences = true, bool isFinalBlock = true)
55 {
56 _ = source.Length;
57 _ = destination.Length;
58 fixed (byte* ptr = &MemoryMarshal.GetReference(source))
59 {
60 fixed (char* ptr2 = &MemoryMarshal.GetReference(destination))
61 {
62 OperationStatus operationStatus = OperationStatus.Done;
63 byte* pInputBufferRemaining = ptr;
64 char* pOutputBufferRemaining = ptr2;
65 while (!source.IsEmpty)
66 {
67 operationStatus = Utf8Utility.TranscodeToUtf16((byte*)Unsafe.AsPointer(ref MemoryMarshal.GetReference(source)), source.Length, (char*)Unsafe.AsPointer(ref MemoryMarshal.GetReference(destination)), destination.Length, out pInputBufferRemaining, out pOutputBufferRemaining);
68 if (operationStatus <= OperationStatus.DestinationTooSmall || (operationStatus == OperationStatus.NeedMoreData && !isFinalBlock))
69 {
70 break;
71 }
72 if (!replaceInvalidSequences)
73 {
74 operationStatus = OperationStatus.InvalidData;
75 break;
76 }
77 destination = destination.Slice((int)(pOutputBufferRemaining - (char*)Unsafe.AsPointer(ref MemoryMarshal.GetReference(destination))));
78 if (destination.IsEmpty)
79 {
80 operationStatus = OperationStatus.DestinationTooSmall;
81 break;
82 }
83 destination[0] = '\ufffd';
84 destination = destination.Slice(1);
85 source = source.Slice((int)(pInputBufferRemaining - (byte*)Unsafe.AsPointer(ref MemoryMarshal.GetReference(source))));
86 Rune.DecodeFromUtf8(source, out var _, out var bytesConsumed);
87 source = source.Slice(bytesConsumed);
88 operationStatus = OperationStatus.Done;
89 pInputBufferRemaining = (byte*)Unsafe.AsPointer(ref MemoryMarshal.GetReference(source));
90 pOutputBufferRemaining = (char*)Unsafe.AsPointer(ref MemoryMarshal.GetReference(destination));
91 }
92 bytesRead = (int)(pInputBufferRemaining - ptr);
93 charsWritten = (int)(pOutputBufferRemaining - ptr2);
94 return operationStatus;
95 }
96 }
97 }
98}
static unsafe OperationStatus TranscodeToUtf8(char *pInputBuffer, int inputLength, byte *pOutputBuffer, int outputBytesRemaining, out char *pInputBufferRemaining, out byte *pOutputBufferRemaining)
static unsafe OperationStatus TranscodeToUtf16(byte *pInputBuffer, int inputLength, char *pOutputBuffer, int outputCharsRemaining, out byte *pInputBufferRemaining, out char *pOutputBufferRemaining)
static unsafe OperationStatus ToUtf16(ReadOnlySpan< byte > source, Span< char > destination, out int bytesRead, out int charsWritten, bool replaceInvalidSequences=true, bool isFinalBlock=true)
Definition Utf8.cs:54
static unsafe OperationStatus FromUtf16(ReadOnlySpan< char > source, Span< byte > destination, out int charsRead, out int bytesWritten, bool replaceInvalidSequences=true, bool isFinalBlock=true)
Definition Utf8.cs:9
static OperationStatus DecodeFromUtf8(ReadOnlySpan< byte > source, out Rune result, out int bytesConsumed)
Definition Rune.cs:202