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

◆ GetBytes() [2/9]

unsafe override int System.Text.UnicodeEncoding.GetBytes ( char * chars,
int charCount,
byte * bytes,
int byteCount,
EncoderNLS encoder )
inlinesealedpackagevirtual

Reimplemented from System.Text.Encoding.

Definition at line 502 of file UnicodeEncoding.cs.

503 {
504 char c = '\0';
505 bool flag = false;
506 byte* ptr = bytes + byteCount;
507 char* ptr2 = chars + charCount;
508 byte* ptr3 = bytes;
509 char* ptr4 = chars;
510 EncoderFallbackBuffer encoderFallbackBuffer = null;
511 if (encoder != null)
512 {
513 c = encoder._charLeftOver;
514 if (encoder.InternalHasFallbackBuffer)
515 {
516 encoderFallbackBuffer = encoder.FallbackBuffer;
517 if (encoderFallbackBuffer.Remaining > 0 && encoder._throwOnOverflow)
518 {
519 throw new ArgumentException(SR.Format(SR.Argument_EncoderFallbackNotEmpty, EncodingName, encoder.Fallback?.GetType()));
520 }
521 encoderFallbackBuffer.InternalInitialize(ptr4, ptr2, encoder, setEncoder: false);
522 }
523 }
524 while (true)
525 {
526 char num = encoderFallbackBuffer?.InternalGetNextChar() ?? '\0';
527 char c2 = num;
528 char* chars2;
529 if (num != 0 || chars < ptr2)
530 {
531 if (c2 == '\0')
532 {
533 if ((bigEndian ^ BitConverter.IsLittleEndian) && ((ulong)chars & 7uL) == 0L && c == '\0')
534 {
535 ulong* ptr5 = (ulong*)(chars - 3 + ((ptr - bytes >> 1 < ptr2 - chars) ? (ptr - bytes >> 1) : (ptr2 - chars)));
536 ulong* ptr6 = (ulong*)chars;
537 ulong* ptr7 = (ulong*)bytes;
538 while (ptr6 < ptr5)
539 {
540 if ((0x8000800080008000uL & *ptr6) != 0L)
541 {
542 ulong num2 = (0xF800F800F800F800uL & *ptr6) ^ 0xD800D800D800D800uL;
543 if ((num2 & 0xFFFF000000000000uL) == 0L || (num2 & 0xFFFF00000000L) == 0L || (num2 & 0xFFFF0000u) == 0L || (num2 & 0xFFFF) == 0L)
544 {
545 long num3 = -287953294993589248L & (long)(*ptr6);
546 if (!BitConverter.IsLittleEndian)
547 {
548 }
549 if (num3 != -2593835887162763264L)
550 {
551 break;
552 }
553 }
554 }
555 Unsafe.WriteUnaligned(ptr7, *ptr6);
556 ptr6++;
557 ptr7++;
558 }
559 chars = (char*)ptr6;
560 bytes = (byte*)ptr7;
561 if (chars >= ptr2)
562 {
563 goto IL_039f;
564 }
565 }
566 c2 = *chars;
567 chars++;
568 }
569 if (c2 >= '\ud800' && c2 <= '\udfff')
570 {
571 if (c2 <= '\udbff')
572 {
573 if (c > '\0')
574 {
575 chars--;
576 if (encoderFallbackBuffer == null)
577 {
578 encoderFallbackBuffer = ((encoder != null) ? encoder.FallbackBuffer : encoderFallback.CreateFallbackBuffer());
579 encoderFallbackBuffer.InternalInitialize(ptr4, ptr2, encoder, setEncoder: true);
580 }
581 chars2 = chars;
582 encoderFallbackBuffer.InternalFallback(c, ref chars2);
583 chars = chars2;
584 c = '\0';
585 }
586 else
587 {
588 c = c2;
589 }
590 continue;
591 }
592 if (c == '\0')
593 {
594 if (encoderFallbackBuffer == null)
595 {
596 encoderFallbackBuffer = ((encoder != null) ? encoder.FallbackBuffer : encoderFallback.CreateFallbackBuffer());
597 encoderFallbackBuffer.InternalInitialize(ptr4, ptr2, encoder, setEncoder: true);
598 }
599 chars2 = chars;
600 encoderFallbackBuffer.InternalFallback(c2, ref chars2);
601 chars = chars2;
602 continue;
603 }
604 if (bytes + 3 >= ptr)
605 {
606 if (encoderFallbackBuffer != null && encoderFallbackBuffer.bFallingBack)
607 {
608 encoderFallbackBuffer.MovePrevious();
609 encoderFallbackBuffer.MovePrevious();
610 }
611 else
612 {
613 chars -= 2;
614 }
615 ThrowBytesOverflow(encoder, bytes == ptr3);
616 c = '\0';
617 goto IL_039f;
618 }
619 if (bigEndian)
620 {
621 *(bytes++) = (byte)((int)c >> 8);
622 *(bytes++) = (byte)c;
623 }
624 else
625 {
626 *(bytes++) = (byte)c;
627 *(bytes++) = (byte)((int)c >> 8);
628 }
629 c = '\0';
630 }
631 else if (c > '\0')
632 {
633 chars--;
634 if (encoderFallbackBuffer == null)
635 {
636 encoderFallbackBuffer = ((encoder != null) ? encoder.FallbackBuffer : encoderFallback.CreateFallbackBuffer());
637 encoderFallbackBuffer.InternalInitialize(ptr4, ptr2, encoder, setEncoder: true);
638 }
639 chars2 = chars;
640 encoderFallbackBuffer.InternalFallback(c, ref chars2);
641 chars = chars2;
642 c = '\0';
643 continue;
644 }
645 if (bytes + 1 < ptr)
646 {
647 if (bigEndian)
648 {
649 *(bytes++) = (byte)((int)c2 >> 8);
650 *(bytes++) = (byte)c2;
651 }
652 else
653 {
654 *(bytes++) = (byte)c2;
655 *(bytes++) = (byte)((int)c2 >> 8);
656 }
657 continue;
658 }
659 if (encoderFallbackBuffer != null && encoderFallbackBuffer.bFallingBack)
660 {
661 encoderFallbackBuffer.MovePrevious();
662 }
663 else
664 {
665 chars--;
666 }
667 ThrowBytesOverflow(encoder, bytes == ptr3);
668 }
669 goto IL_039f;
670 IL_039f:
671 if (c <= '\0' || (encoder != null && !encoder.MustFlush))
672 {
673 break;
674 }
675 if (flag)
676 {
677 throw new ArgumentException(SR.Format(SR.Argument_RecursiveFallback, c), "chars");
678 }
679 if (encoderFallbackBuffer == null)
680 {
681 encoderFallbackBuffer = ((encoder != null) ? encoder.FallbackBuffer : encoderFallback.CreateFallbackBuffer());
682 encoderFallbackBuffer.InternalInitialize(ptr4, ptr2, encoder, setEncoder: true);
683 }
684 chars2 = chars;
685 encoderFallbackBuffer.InternalFallback(c, ref chars2);
686 chars = chars2;
687 c = '\0';
688 flag = true;
689 }
690 if (encoder != null)
691 {
692 encoder._charLeftOver = c;
693 encoder._charsUsed = (int)(chars - ptr4);
694 }
695 return (int)(bytes - ptr3);
696 }
EncoderFallback encoderFallback
Definition Encoding.cs:341
virtual string EncodingName
Definition Encoding.cs:362

References System.Text.EncoderNLS._charLeftOver, System.Text.EncoderNLS._throwOnOverflow, System.SR.Argument_EncoderFallbackNotEmpty, System.SR.Argument_RecursiveFallback, System.Text.EncoderFallbackBuffer.bFallingBack, System.Text.UnicodeEncoding.bigEndian, System.byteCount, System.bytes, System.charCount, System.chars, System.Text.EncoderFallback.CreateFallbackBuffer(), System.Text.Encoding.encoderFallback, System.Text.Encoding.EncodingName, System.Text.EncoderNLS.Fallback, System.Text.EncoderNLS.FallbackBuffer, System.SR.Format(), System.Text.EncoderFallbackBuffer.InternalFallback(), System.Text.EncoderFallbackBuffer.InternalGetNextChar(), System.Text.EncoderNLS.InternalHasFallbackBuffer, System.Text.EncoderFallbackBuffer.InternalInitialize(), System.BitConverter.IsLittleEndian, System.L, System.Text.EncoderFallbackBuffer.MovePrevious(), System.Text.EncoderNLS.MustFlush, System.Text.EncoderFallbackBuffer.Remaining, and System.Text.Encoding.ThrowBytesOverflow().