387 public unsafe
static OperationStatus TranscodeToUtf16(
byte* pInputBuffer,
int inputLength,
char* pOutputBuffer,
int outputCharsRemaining, out
byte* pInputBufferRemaining, out
char* pOutputBufferRemaining)
391 pOutputBuffer += num;
392 if ((
int)num == inputLength)
394 pInputBufferRemaining = pInputBuffer;
395 pOutputBufferRemaining = pOutputBuffer;
398 inputLength -= (int)num;
399 outputCharsRemaining -= (int)num;
404 byte* ptr = pInputBuffer + (uint)inputLength - 4;
408 uint num2 =
Unsafe.ReadUnaligned<uint>(pInputBuffer);
418 if (outputCharsRemaining >= 4)
423 outputCharsRemaining -= 4;
424 uint val = (uint)((
int)(
void*)
Unsafe.ByteOffset(ref *pInputBuffer, ref *ptr) + 4);
425 uint num3 =
Math.
Min(val, (uint)outputCharsRemaining) / 8;
427 while ((uint)num4 < num3)
429 num2 =
Unsafe.ReadUnaligned<uint>(pInputBuffer);
430 num5 =
Unsafe.ReadUnaligned<uint>(pInputBuffer + 4);
442 outputCharsRemaining -= 8 * num4;
447 inputLength = (int)(
void*)
Unsafe.ByteOffset(ref *pInputBuffer, ref *ptr) + 4;
450 if (pInputBuffer <= ptr)
458 if (outputCharsRemaining >= 3)
462 *pOutputBuffer = (char)(
byte)num6;
467 pOutputBuffer[1] = (char)(
byte)num6;
472 pOutputBuffer[2] = (char)(
byte)num6;
475 pInputBuffer += num7;
476 pOutputBuffer += num7;
477 outputCharsRemaining -= (int)num7;
481 if (outputCharsRemaining == 0)
487 *(pOutputBuffer++) = (
char)(byte)num8;
488 outputCharsRemaining--;
491 if (outputCharsRemaining == 0)
497 *(pOutputBuffer++) = (
char)(byte)num8;
502 outputCharsRemaining = 0;
505 if (pInputBuffer > ptr)
509 num2 =
Unsafe.ReadUnaligned<uint>(pInputBuffer);
523 if (outputCharsRemaining >= 2)
528 outputCharsRemaining -= 2;
529 if (pInputBuffer <= ptr)
531 num2 =
Unsafe.ReadUnaligned<uint>(pInputBuffer);
549 if (outputCharsRemaining >= 2)
551 *pOutputBuffer = (char)num9;
552 char* num10 = pOutputBuffer + 1;
557 *num10 = (char)(
byte)(num11 >> 16);
560 outputCharsRemaining -= 2;
561 if (ptr >= pInputBuffer)
563 num2 =
Unsafe.ReadUnaligned<uint>(pInputBuffer);
568 else if (outputCharsRemaining != 0)
570 *pOutputBuffer = (char)num9;
573 outputCharsRemaining--;
574 if (ptr >= pInputBuffer)
576 num2 =
Unsafe.ReadUnaligned<uint>(pInputBuffer);
589 if ((num2 & 0x200F) == 0 || ((num2 - 8205) & 0x200F) == 0)
593 if (outputCharsRemaining == 0)
598 if ((((
int)num2 - -536870912) & -268435456) == 0 && outputCharsRemaining > 1 && (nint)(
void*)
Unsafe.ByteOffset(ref *pInputBuffer, ref *ptr) >= (nint)3)
600 uint num12 =
Unsafe.ReadUnaligned<uint>(pInputBuffer + 3);
607 outputCharsRemaining -= 2;
614 outputCharsRemaining--;
619 if (outputCharsRemaining == 0)
624 *pOutputBuffer = (char)(num2 >> 24);
627 outputCharsRemaining--;
629 if (pInputBuffer <= ptr)
631 num2 =
Unsafe.ReadUnaligned<uint>(pInputBuffer);
644 uint
value = num2 & 0xFFFFu;
648 if (outputCharsRemaining < 2)
655 outputCharsRemaining -= 2;
661 if (outputCharsRemaining >= 3)
663 *pOutputBuffer = (char)num9;
666 pOutputBuffer[1] = (char)(
byte)num2;
668 pOutputBuffer[2] = (char)num2;
671 outputCharsRemaining -= 3;
682 outputCharsRemaining -= 4;
684 outputCharsRemaining -= 8 * num4;
700 pInputBufferRemaining = pInputBuffer;
701 pOutputBufferRemaining = pOutputBuffer;
708 uint num13 = *pInputBuffer;
711 if (outputCharsRemaining != 0)
713 *pOutputBuffer = (char)num13;
717 outputCharsRemaining--;
723 if ((uint)(byte)num13 <= 29u)
729 uint num14 = pInputBuffer[1];
732 if (outputCharsRemaining != 0)
734 uint num15 = (num13 << 6) + num14 + 128 - 128;
735 *pOutputBuffer = (char)num15;
739 outputCharsRemaining--;
745 else if ((uint)(byte)num13 <= 45u)
747 if (inputLength >= 3)
749 uint num16 = pInputBuffer[1];
750 uint num17 = pInputBuffer[2];
753 uint num18 = (num13 << 12) + (num16 << 6);
759 if (outputCharsRemaining != 0)
764 *pOutputBuffer = (char)num18;
768 outputCharsRemaining--;
782 uint num19 = pInputBuffer[1];
785 uint num20 = (num13 << 6) + num19;
793 else if ((uint)(byte)num13 <= 50u)
799 uint num21 = pInputBuffer[1];
802 uint value2 = (num13 << 6) + num21;
834 public unsafe
static OperationStatus TranscodeToUtf8(
char* pInputBuffer,
int inputLength,
byte* pOutputBuffer,
int outputBytesRemaining, out
char* pInputBufferRemaining, out
byte* pOutputBufferRemaining)
838 pOutputBuffer += num;
839 if ((
int)num == inputLength)
841 pInputBufferRemaining = pInputBuffer;
842 pOutputBufferRemaining = pOutputBuffer;
845 inputLength -= (int)num;
846 outputBytesRemaining -= (int)num;
851 char* ptr = pInputBuffer + (uint)inputLength - 2;
861 num2 =
Unsafe.ReadUnaligned<uint>(pInputBuffer);
869 if (outputBytesRemaining < 2)
873 uint num3 = num2 | (num2 >> 8);
874 Unsafe.WriteUnaligned(pOutputBuffer, (ushort)num3);
877 outputBytesRemaining -= 2;
878 uint num4 = (uint)((
int)(ptr - pInputBuffer) + 2);
879 uint num5 = (uint)
Math.
Min(num4, outputBytesRemaining);
887 uint num6 = num5 / 8;
889 while ((uint)num7 < num6)
906 outputBytesRemaining -= 8 * num7;
907 if ((num5 & 4u) != 0)
909 num8 =
Unsafe.ReadUnaligned<ulong>(pInputBuffer);
921 outputBytesRemaining -= 4;
926 uint num9 = num5 / 4;
928 while ((uint)num10 < num9)
930 num2 =
Unsafe.ReadUnaligned<uint>(pInputBuffer);
931 num11 =
Unsafe.ReadUnaligned<uint>(pInputBuffer + 2);
934 Unsafe.WriteUnaligned(pOutputBuffer, (ushort)(num2 | (num2 >> 8)));
935 Unsafe.WriteUnaligned(pOutputBuffer + 2, (ushort)(num11 | (num11 >> 8)));
943 outputBytesRemaining -= 4 * num10;
949 if (outputBytesRemaining >= 4)
954 outputBytesRemaining -= 4;
961 if (outputBytesRemaining >= 3)
965 pOutputBuffer[2] = (byte)num2;
968 outputBytesRemaining -= 3;
975 if (pInputBuffer <= ptr)
981 inputLength = (int)(ptr - pInputBuffer) + 2;
987 Unsafe.WriteUnaligned(pOutputBuffer, (ushort)(num2 | (num2 >> 8)));
990 outputBytesRemaining -= 2;
991 num2 = (uint)(num8 >> 32);
995 outputBytesRemaining -= 8 * num7;
1005 outputBytesRemaining -= 4;
1006 num8 = vector.AsUInt64().GetElement(1);
1010 outputBytesRemaining -= 4 * num10;
1013 Unsafe.WriteUnaligned(pOutputBuffer, (ushort)(num2 | (num2 >> 8)));
1016 outputBytesRemaining -= 2;
1025 if (outputBytesRemaining == 0)
1030 *pOutputBuffer = (byte)num2;
1033 outputBytesRemaining--;
1034 if (pInputBuffer > ptr)
1038 num2 =
Unsafe.ReadUnaligned<uint>(pInputBuffer);
1044 if (outputBytesRemaining < 4)
1051 outputBytesRemaining -= 4;
1052 if (pInputBuffer <= ptr)
1054 num2 =
Unsafe.ReadUnaligned<uint>(pInputBuffer);
1063 if (outputBytesRemaining < 2)
1074 outputBytesRemaining -= 2;
1075 if (pInputBuffer > ptr)
1079 num2 =
Unsafe.ReadUnaligned<uint>(pInputBuffer);
1088 outputBytesRemaining -= 6;
1089 if (pInputBuffer <= ptr)
1091 num2 =
Unsafe.ReadUnaligned<uint>(pInputBuffer);
1101 if (outputBytesRemaining < 3)
1108 outputBytesRemaining -= 3;
1113 if (outputBytesRemaining == 0)
1118 *pOutputBuffer = (byte)(num2 >> 16);
1121 outputBytesRemaining--;
1122 if (pInputBuffer <= ptr)
1124 num2 =
Unsafe.ReadUnaligned<uint>(pInputBuffer);
1136 if (pInputBuffer <= ptr)
1138 num2 =
Unsafe.ReadUnaligned<uint>(pInputBuffer);
1154 uint num12 = num2 & 0xFFFFu;
1157 pInputBufferRemaining = pInputBuffer;
1158 pOutputBufferRemaining = pOutputBuffer;
1173 if (outputBytesRemaining != 0)
1175 *pOutputBuffer = (byte)num12;
1181 else if (num12 < 2048)
1183 if (outputBytesRemaining >= 2)
1185 pOutputBuffer[1] = (byte)((num12 & 0x3Fu) | 0xFFFFFF80u);
1186 *pOutputBuffer = (byte)((num12 >> 6) | 0xFFFFFFC0u);
1203 if (outputBytesRemaining >= 3)
1205 pOutputBuffer[2] = (byte)((num12 & 0x3Fu) | 0xFFFFFF80u);
1206 pOutputBuffer[1] = (byte)(((num12 >> 6) & 0x3Fu) | 0xFFFFFF80u);
1207 *pOutputBuffer = (byte)((num12 >> 12) | 0xFFFFFFE0u);
1215 if (inputLength != 0)
1217 num12 = *pInputBuffer;
1222 if (inputLength <= 1)
1229 public unsafe
static byte*
GetPointerToFirstInvalidByte(
byte* pInputBuffer,
int inputLength, out
int utf16CodeUnitCountAdjustment, out
int scalarCountAdjustment)
1232 pInputBuffer += indexOfFirstNonAsciiByte;
1233 inputLength -= (int)indexOfFirstNonAsciiByte;
1234 if (inputLength == 0)
1236 utf16CodeUnitCountAdjustment = 0;
1237 scalarCountAdjustment = 0;
1238 return pInputBuffer;
1243 if (inputLength >= 4)
1245 byte* ptr = pInputBuffer + (uint)inputLength - 4;
1246 while (pInputBuffer <= ptr)
1248 uint num3 =
Unsafe.ReadUnaligned<uint>(pInputBuffer);
1255 if ((nint)(
void*)
Unsafe.ByteOffset(ref *pInputBuffer, ref *ptr) < (nint)16)
1259 num3 =
Unsafe.ReadUnaligned<uint>(pInputBuffer);
1262 pInputBuffer = (
byte*)((nuint)(pInputBuffer + 4) & ~(nuint)3u);
1263 byte* ptr2 = ptr - 12;
1287 num3 = *(uint*)pInputBuffer;
1291 num3 = *(uint*)pInputBuffer;
1296 if (pInputBuffer > ptr2)
1302 pInputBuffer += num5;
1303 if (pInputBuffer > ptr)
1307 num3 =
Unsafe.ReadUnaligned<uint>(pInputBuffer);
1314 pInputBuffer += num6;
1315 if (ptr < pInputBuffer)
1319 num3 =
Unsafe.ReadUnaligned<uint>(pInputBuffer);
1332 num3 = num7 - 32960;
1337 if ((num8 & 0xC0E0u) != 0)
1342 if ((uint)(byte)num3 >= 2u)
1356 if (pInputBuffer > ptr)
1360 num3 =
Unsafe.ReadUnaligned<uint>(pInputBuffer);
1376 if (pInputBuffer > ptr)
1380 num3 =
Unsafe.ReadUnaligned<uint>(pInputBuffer);
1392 num3 = num9 - 8388640;
1397 if ((num10 & 0xC0C0F0) == 0)
1402 if ((num3 & 0x200F) == 0 || ((num3 - 8205) & 0x200F) == 0)
1410 nint num11 = (int)num3 >> 31;
1412 pInputBuffer += num11;
1419 if ((nint)(ptr - pInputBuffer) < 5)
1423 num12 =
Unsafe.ReadUnaligned<ulong>(pInputBuffer);
1425 if ((num12 & 0xC0F0C0C0F0C0C0F0uL) == 9286563722648649952uL &&
IsUtf8ContinuationByte(in pInputBuffer[8]))
1427 if (((
int)num12 & 0x200F) == 0 || (((int)num12 - 8205) & 0x200F) == 0)
1432 if (((uint)(int)num12 & 0x200Fu) != 0 && ((uint)((
int)num12 - 8205) & 0x200Fu) != 0)
1435 if (((uint)(int)num12 & 0x200Fu) != 0 && ((uint)((
int)num12 - 8205) & 0x200Fu) != 0)
1448 if ((num12 & 0xC0C0F0C0C0F0L) == 141291010687200
L)
1450 if (((
int)num12 & 0x200F) == 0 || (((
int)num12 - 8205) & 0x200F) == 0)
1455 if (((
int)num12 & 0x200F) == 0 || (((
int)num12 - 8205) & 0x200F) == 0)
1463 if (pInputBuffer > ptr)
1467 num3 =
Unsafe.ReadUnaligned<uint>(pInputBuffer);
1486 num3 &= 0xC0C0FFFFu;
1487 if ((
int)num3 <= -2147467265)
1508 num13 = (nuint)((
byte*)(
void*)
Unsafe.ByteOffset(ref *pInputBuffer, ref *ptr) + 4);
1512 num13 = (uint)inputLength;
1516 uint num14 = *pInputBuffer;
1517 if ((uint)(byte)num14 < 128u)
1527 uint
value = pInputBuffer[1];
1528 if ((uint)(byte)num14 < 224u)
1539 if (num13 < 3 || (uint)(byte)num14 >= 240u)
1543 if ((
byte)num14 == 224)
1550 else if ((
byte)num14 == 237)
1571 utf16CodeUnitCountAdjustment = num;
1572 scalarCountAdjustment = num2;
1573 return pInputBuffer;