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

◆ GetChars() [2/6]

unsafe override int System.Text.DBCSCodePageEncoding.GetChars ( byte * bytes,
int byteCount,
char * chars,
int charCount,
System::Text::DecoderNLS baseDecoder )
inlinevirtualinherited

Reimplemented from System.Text.Encoding.

Reimplemented in System.Text.GB18030Encoding, and System.Text.ISO2022Encoding.

Definition at line 754 of file DBCSCodePageEncoding.cs.

755 {
757 DBCSDecoder dBCSDecoder = (DBCSDecoder)baseDecoder;
758 byte* ptr = bytes;
759 byte* ptr2 = bytes + byteCount;
760 char* ptr3 = chars;
761 char* ptr4 = chars + charCount;
762 bool flag = false;
763 DecoderFallbackBuffer decoderFallbackBuffer = null;
764 DecoderFallbackBufferHelper decoderFallbackBufferHelper = new DecoderFallbackBufferHelper(decoderFallbackBuffer);
765 if (dBCSDecoder != null && dBCSDecoder.bLeftOver > 0)
766 {
767 if (byteCount == 0)
768 {
769 if (!dBCSDecoder.MustFlush)
770 {
771 return 0;
772 }
773 decoderFallbackBuffer = dBCSDecoder.FallbackBuffer;
774 decoderFallbackBufferHelper = new DecoderFallbackBufferHelper(decoderFallbackBuffer);
775 decoderFallbackBufferHelper.InternalInitialize(bytes, ptr4);
776 byte[] bytes2 = new byte[1] { dBCSDecoder.bLeftOver };
777 if (!decoderFallbackBufferHelper.InternalFallback(bytes2, bytes, ref chars))
778 {
779 ThrowCharsOverflow(dBCSDecoder, nothingDecoded: true);
780 }
781 dBCSDecoder.bLeftOver = 0;
782 return (int)(chars - ptr3);
783 }
784 int num = dBCSDecoder.bLeftOver << 8;
785 num |= *bytes;
786 bytes++;
787 char c = mapBytesToUnicode[num];
788 if (c == '\0' && num != 0)
789 {
790 decoderFallbackBuffer = dBCSDecoder.FallbackBuffer;
791 decoderFallbackBufferHelper = new DecoderFallbackBufferHelper(decoderFallbackBuffer);
792 decoderFallbackBufferHelper.InternalInitialize(ptr2 - byteCount, ptr4);
793 byte[] bytes3 = new byte[2]
794 {
795 (byte)(num >> 8),
796 (byte)num
797 };
798 if (!decoderFallbackBufferHelper.InternalFallback(bytes3, bytes, ref chars))
799 {
800 ThrowCharsOverflow(dBCSDecoder, nothingDecoded: true);
801 }
802 }
803 else
804 {
805 if (chars >= ptr4)
806 {
807 ThrowCharsOverflow(dBCSDecoder, nothingDecoded: true);
808 }
809 *(chars++) = c;
810 }
811 }
812 while (bytes < ptr2)
813 {
814 int num2 = *bytes;
815 bytes++;
816 char c2 = mapBytesToUnicode[num2];
817 if (c2 == '\ufffe')
818 {
819 if (bytes < ptr2)
820 {
821 num2 <<= 8;
822 num2 |= *bytes;
823 bytes++;
824 c2 = mapBytesToUnicode[num2];
825 }
826 else
827 {
828 if (dBCSDecoder != null && !dBCSDecoder.MustFlush)
829 {
830 flag = true;
831 dBCSDecoder.bLeftOver = (byte)num2;
832 break;
833 }
834 c2 = '\0';
835 }
836 }
837 if (c2 == '\0' && num2 != 0)
838 {
839 if (decoderFallbackBuffer == null)
840 {
841 decoderFallbackBuffer = ((dBCSDecoder != null) ? dBCSDecoder.FallbackBuffer : base.DecoderFallback.CreateFallbackBuffer());
842 decoderFallbackBufferHelper = new DecoderFallbackBufferHelper(decoderFallbackBuffer);
843 decoderFallbackBufferHelper.InternalInitialize(ptr2 - byteCount, ptr4);
844 }
845 byte[] array = ((num2 >= 256) ? new byte[2]
846 {
847 (byte)(num2 >> 8),
848 (byte)num2
849 } : new byte[1] { (byte)num2 });
850 if (!decoderFallbackBufferHelper.InternalFallback(array, bytes, ref chars))
851 {
852 bytes -= array.Length;
853 decoderFallbackBufferHelper.InternalReset();
854 ThrowCharsOverflow(dBCSDecoder, bytes == ptr);
855 break;
856 }
857 continue;
858 }
859 if (chars >= ptr4)
860 {
861 bytes--;
862 if (num2 >= 256)
863 {
864 bytes--;
865 }
866 ThrowCharsOverflow(dBCSDecoder, bytes == ptr);
867 break;
868 }
869 *(chars++) = c2;
870 }
871 if (dBCSDecoder != null)
872 {
873 if (!flag)
874 {
875 dBCSDecoder.bLeftOver = 0;
876 }
877 dBCSDecoder.m_bytesUsed = (int)(bytes - ptr);
878 }
879 return (int)(chars - ptr3);
880 }
DecoderFallback DecoderFallback
Definition Encoding.cs:480

References System.array, System.Text.DBCSCodePageEncoding.DBCSDecoder.bLeftOver, System.byteCount, System.bytes, System.charCount, System.chars, System.Text.BaseCodePageEncoding.CheckMemorySection(), System.Text.DecoderNLS.FallbackBuffer, System.Text.DecoderFallbackBufferHelper.InternalFallback(), System.Text.DecoderFallbackBufferHelper.InternalInitialize(), System.Text.DecoderFallbackBufferHelper.InternalReset(), System.Text.DBCSCodePageEncoding.mapBytesToUnicode, System.Text.DecoderNLS.MustFlush, and System.Text.EncodingNLS.ThrowCharsOverflow().