EncodingNLS
using System.Diagnostics.CodeAnalysis;
namespace System.Text
{
    internal abstract class EncodingNLS : Encoding
    {
        private string _encodingName;
        private string _webName;
        public override string EncodingName {
            get {
                if (_encodingName == null) {
                    _encodingName = GetLocalizedEncodingNameResource(CodePage);
                    if (_encodingName == null)
                        throw new NotSupportedException(System.SR.Format(System.SR.MissingEncodingNameResource, WebName, CodePage));
                    if (_encodingName.StartsWith("Globalization_cp_", StringComparison.OrdinalIgnoreCase)) {
                        _encodingName = System.Text.EncodingTable.GetEnglishNameFromCodePage(CodePage);
                        if (_encodingName == null)
                            throw new NotSupportedException(System.SR.Format(System.SR.MissingEncodingNameResource, WebName, CodePage));
                    }
                }
                return _encodingName;
            }
        }
        public override string WebName {
            get {
                if (_webName == null) {
                    _webName = System.Text.EncodingTable.GetWebNameFromCodePage(CodePage);
                    if (_webName == null)
                        throw new NotSupportedException(System.SR.Format(System.SR.NotSupported_NoCodepageData, CodePage));
                }
                return _webName;
            }
        }
        public override string HeaderName {
            get {
                switch (CodePage) {
                case 932:
                    return "iso-2022-jp";
                case 50221:
                    return "iso-2022-jp";
                case 50225:
                    return "euc-kr";
                default:
                    return WebName;
                }
            }
        }
        public override string BodyName {
            get {
                switch (CodePage) {
                case 932:
                    return "iso-2022-jp";
                case 1250:
                    return "iso-8859-2";
                case 1251:
                    return "koi8-r";
                case 1252:
                    return "iso-8859-1";
                case 1253:
                    return "iso-8859-7";
                case 1254:
                    return "iso-8859-9";
                case 50221:
                    return "iso-2022-jp";
                case 50225:
                    return "iso-2022-kr";
                default:
                    return WebName;
                }
            }
        }
        protected EncodingNLS(int codePage)
            : base(codePage)
        {
        }
        protected EncodingNLS(int codePage, EncoderFallback enc, DecoderFallback dec)
            : base(codePage, enc, dec)
        {
        }
        public unsafe abstract int GetByteCount(char* chars, int count, System.Text.EncoderNLS encoder);
        public unsafe abstract int GetBytes(char* chars, int charCount, byte* bytes, int byteCount, System.Text.EncoderNLS encoder);
        public unsafe abstract int GetCharCount(byte* bytes, int count, System.Text.DecoderNLS decoder);
        public unsafe abstract int GetChars(byte* bytes, int byteCount, char* chars, int charCount, System.Text.DecoderNLS decoder);
        public unsafe override int GetByteCount(char[] chars, int index, int count)
        {
            if (chars == null)
                throw new ArgumentNullException("chars");
            if (index < 0 || count < 0)
                throw new ArgumentOutOfRangeException((index < 0) ? "index" : "count", System.SR.ArgumentOutOfRange_NeedNonNegNum);
            if (chars.Length - index < count)
                throw new ArgumentOutOfRangeException("chars", System.SR.ArgumentOutOfRange_IndexCountBuffer);
            if (chars.Length != 0) {
                fixed (char* ptr = &chars[0]) {
                    return GetByteCount(ptr + index, count, null);
                }
            }
            return 0;
        }
        public unsafe override int GetByteCount(string s)
        {
            if (s != null) {
                fixed (char* chars = s) {
                    return GetByteCount(chars, s.Length, null);
                }
            }
            throw new ArgumentNullException("s");
        }
        public unsafe override int GetByteCount(char* chars, int count)
        {
            if (chars == null)
                throw new ArgumentNullException("chars");
            if (count < 0)
                throw new ArgumentOutOfRangeException("count", System.SR.ArgumentOutOfRange_NeedNonNegNum);
            return GetByteCount(chars, count, null);
        }
        public unsafe override int GetBytes(string s, int charIndex, int charCount, byte[] bytes, int byteIndex)
        {
            if (s == null)
                throw new ArgumentNullException("s");
            if (bytes == null)
                throw new ArgumentNullException("bytes");
            if (charIndex < 0 || charCount < 0)
                throw new ArgumentOutOfRangeException((charIndex < 0) ? "charIndex" : "charCount", System.SR.ArgumentOutOfRange_NeedNonNegNum);
            if (s.Length - charIndex < charCount)
                throw new ArgumentOutOfRangeException("s", System.SR.ArgumentOutOfRange_IndexCount);
            if (byteIndex >= 0 && byteIndex <= bytes.Length) {
                int byteCount = bytes.Length - byteIndex;
                fixed (char* ptr = s) {
                    fixed (byte* ptr2 = &CodePagesEncodingProvider.GetNonNullPinnableReference(bytes)) {
                        return GetBytes(ptr + charIndex, charCount, ptr2 + byteIndex, byteCount, null);
                    }
                }
            }
            throw new ArgumentOutOfRangeException("byteIndex", System.SR.ArgumentOutOfRange_IndexMustBeLessOrEqual);
        }
        public unsafe override int GetBytes(char[] chars, int charIndex, int charCount, byte[] bytes, int byteIndex)
        {
            if (chars == null)
                throw new ArgumentNullException("chars");
            if (bytes == null)
                throw new ArgumentNullException("bytes");
            if (charIndex < 0 || charCount < 0)
                throw new ArgumentOutOfRangeException((charIndex < 0) ? "charIndex" : "charCount", System.SR.ArgumentOutOfRange_NeedNonNegNum);
            if (chars.Length - charIndex < charCount)
                throw new ArgumentOutOfRangeException("chars", System.SR.ArgumentOutOfRange_IndexCountBuffer);
            if (byteIndex < 0 || byteIndex > bytes.Length)
                throw new ArgumentOutOfRangeException("byteIndex", System.SR.ArgumentOutOfRange_IndexMustBeLessOrEqual);
            if (chars.Length != 0) {
                int byteCount = bytes.Length - byteIndex;
                fixed (char* ptr = &chars[0]) {
                    fixed (byte* ptr2 = &CodePagesEncodingProvider.GetNonNullPinnableReference(bytes)) {
                        return GetBytes(ptr + charIndex, charCount, ptr2 + byteIndex, byteCount, null);
                    }
                }
            }
            return 0;
        }
        public unsafe override int GetBytes(char* chars, int charCount, byte* bytes, int byteCount)
        {
            if (chars == null)
                throw new ArgumentNullException("chars");
            if (bytes == null)
                throw new ArgumentNullException("bytes");
            if (charCount < 0 || byteCount < 0)
                throw new ArgumentOutOfRangeException((charCount < 0) ? "charCount" : "byteCount", System.SR.ArgumentOutOfRange_NeedNonNegNum);
            return GetBytes(chars, charCount, bytes, byteCount, null);
        }
        public unsafe override int GetCharCount(byte[] bytes, int index, int count)
        {
            if (bytes == null)
                throw new ArgumentNullException("bytes");
            if (index < 0 || count < 0)
                throw new ArgumentOutOfRangeException((index < 0) ? "index" : "count", System.SR.ArgumentOutOfRange_NeedNonNegNum);
            if (bytes.Length - index < count)
                throw new ArgumentOutOfRangeException("bytes", System.SR.ArgumentOutOfRange_IndexCountBuffer);
            if (bytes.Length != 0) {
                fixed (byte* ptr = &bytes[0]) {
                    return GetCharCount(ptr + index, count, null);
                }
            }
            return 0;
        }
        public unsafe override int GetCharCount(byte* bytes, int count)
        {
            if (bytes == null)
                throw new ArgumentNullException("bytes");
            if (count < 0)
                throw new ArgumentOutOfRangeException("count", System.SR.ArgumentOutOfRange_NeedNonNegNum);
            return GetCharCount(bytes, count, null);
        }
        public unsafe override int GetChars(byte[] bytes, int byteIndex, int byteCount, char[] chars, int charIndex)
        {
            if (bytes == null)
                throw new ArgumentNullException("bytes");
            if (chars == null)
                throw new ArgumentNullException("chars");
            if (byteIndex < 0 || byteCount < 0)
                throw new ArgumentOutOfRangeException((byteIndex < 0) ? "byteIndex" : "byteCount", System.SR.ArgumentOutOfRange_NeedNonNegNum);
            if (bytes.Length - byteIndex < byteCount)
                throw new ArgumentOutOfRangeException("bytes", System.SR.ArgumentOutOfRange_IndexCountBuffer);
            if (charIndex < 0 || charIndex > chars.Length)
                throw new ArgumentOutOfRangeException("charIndex", System.SR.ArgumentOutOfRange_IndexMustBeLessOrEqual);
            if (bytes.Length != 0) {
                int charCount = chars.Length - charIndex;
                fixed (byte* ptr = &bytes[0]) {
                    fixed (char* ptr2 = &CodePagesEncodingProvider.GetNonNullPinnableReference(chars)) {
                        return GetChars(ptr + byteIndex, byteCount, ptr2 + charIndex, charCount, null);
                    }
                }
            }
            return 0;
        }
        public unsafe override int GetChars(byte* bytes, int byteCount, char* chars, int charCount)
        {
            if (bytes == null)
                throw new ArgumentNullException("bytes");
            if (chars == null)
                throw new ArgumentNullException("chars");
            if (charCount < 0 || byteCount < 0)
                throw new ArgumentOutOfRangeException((charCount < 0) ? "charCount" : "byteCount", System.SR.ArgumentOutOfRange_NeedNonNegNum);
            return GetChars(bytes, byteCount, chars, charCount, null);
        }
        public unsafe override string GetString(byte[] bytes, int index, int count)
        {
            if (bytes == null)
                throw new ArgumentNullException("bytes");
            if (index < 0 || count < 0)
                throw new ArgumentOutOfRangeException((index < 0) ? "index" : "count", System.SR.ArgumentOutOfRange_NeedNonNegNum);
            if (bytes.Length - index < count)
                throw new ArgumentOutOfRangeException("bytes", System.SR.ArgumentOutOfRange_IndexCountBuffer);
            if (bytes.Length != 0) {
                fixed (byte* ptr = &bytes[0]) {
                    return GetString(ptr + index, count);
                }
            }
            return string.Empty;
        }
        public override Decoder GetDecoder()
        {
            return new System.Text.DecoderNLS(this);
        }
        public override Encoder GetEncoder()
        {
            return new System.Text.EncoderNLS(this);
        }
        internal void ThrowBytesOverflow(System.Text.EncoderNLS encoder, bool nothingEncoded)
        {
            if ((encoder?.m_throwOnOverflow ?? true) | nothingEncoded) {
                if (encoder != null && encoder.InternalHasFallbackBuffer)
                    encoder.FallbackBuffer.Reset();
                ThrowBytesOverflow();
            }
            encoder.ClearMustFlush();
        }
        internal void ThrowCharsOverflow(System.Text.DecoderNLS decoder, bool nothingDecoded)
        {
            if ((decoder?.m_throwOnOverflow ?? true) | nothingDecoded) {
                if (decoder != null && decoder.InternalHasFallbackBuffer)
                    decoder.FallbackBuffer.Reset();
                ThrowCharsOverflow();
            }
            decoder.ClearMustFlush();
        }
        [System.Diagnostics.CodeAnalysis.DoesNotReturn]
        internal void ThrowBytesOverflow()
        {
            throw new ArgumentException(System.SR.Format(System.SR.Argument_EncodingConversionOverflowBytes, EncodingName, base.EncoderFallback.GetType()), "bytes");
        }
        [System.Diagnostics.CodeAnalysis.DoesNotReturn]
        internal void ThrowCharsOverflow()
        {
            throw new ArgumentException(System.SR.Format(System.SR.Argument_EncodingConversionOverflowChars, EncodingName, base.DecoderFallback.GetType()), "chars");
        }
        internal static string GetLocalizedEncodingNameResource(int codePage)
        {
            switch (codePage) {
            case 37:
                return System.SR.Globalization_cp_37;
            case 437:
                return System.SR.Globalization_cp_437;
            case 500:
                return System.SR.Globalization_cp_500;
            case 708:
                return System.SR.Globalization_cp_708;
            case 720:
                return System.SR.Globalization_cp_720;
            case 737:
                return System.SR.Globalization_cp_737;
            case 775:
                return System.SR.Globalization_cp_775;
            case 850:
                return System.SR.Globalization_cp_850;
            case 852:
                return System.SR.Globalization_cp_852;
            case 855:
                return System.SR.Globalization_cp_855;
            case 857:
                return System.SR.Globalization_cp_857;
            case 858:
                return System.SR.Globalization_cp_858;
            case 860:
                return System.SR.Globalization_cp_860;
            case 861:
                return System.SR.Globalization_cp_861;
            case 862:
                return System.SR.Globalization_cp_862;
            case 863:
                return System.SR.Globalization_cp_863;
            case 864:
                return System.SR.Globalization_cp_864;
            case 865:
                return System.SR.Globalization_cp_865;
            case 866:
                return System.SR.Globalization_cp_866;
            case 869:
                return System.SR.Globalization_cp_869;
            case 870:
                return System.SR.Globalization_cp_870;
            case 874:
                return System.SR.Globalization_cp_874;
            case 875:
                return System.SR.Globalization_cp_875;
            case 932:
                return System.SR.Globalization_cp_932;
            case 936:
                return System.SR.Globalization_cp_936;
            case 949:
                return System.SR.Globalization_cp_949;
            case 950:
                return System.SR.Globalization_cp_950;
            case 1026:
                return System.SR.Globalization_cp_1026;
            case 1047:
                return System.SR.Globalization_cp_1047;
            case 1140:
                return System.SR.Globalization_cp_1140;
            case 1141:
                return System.SR.Globalization_cp_1141;
            case 1142:
                return System.SR.Globalization_cp_1142;
            case 1143:
                return System.SR.Globalization_cp_1143;
            case 1144:
                return System.SR.Globalization_cp_1144;
            case 1145:
                return System.SR.Globalization_cp_1145;
            case 1146:
                return System.SR.Globalization_cp_1146;
            case 1147:
                return System.SR.Globalization_cp_1147;
            case 1148:
                return System.SR.Globalization_cp_1148;
            case 1149:
                return System.SR.Globalization_cp_1149;
            case 1250:
                return System.SR.Globalization_cp_1250;
            case 1251:
                return System.SR.Globalization_cp_1251;
            case 1252:
                return System.SR.Globalization_cp_1252;
            case 1253:
                return System.SR.Globalization_cp_1253;
            case 1254:
                return System.SR.Globalization_cp_1254;
            case 1255:
                return System.SR.Globalization_cp_1255;
            case 1256:
                return System.SR.Globalization_cp_1256;
            case 1257:
                return System.SR.Globalization_cp_1257;
            case 1258:
                return System.SR.Globalization_cp_1258;
            case 1361:
                return System.SR.Globalization_cp_1361;
            case 10000:
                return System.SR.Globalization_cp_10000;
            case 10001:
                return System.SR.Globalization_cp_10001;
            case 10002:
                return System.SR.Globalization_cp_10002;
            case 10003:
                return System.SR.Globalization_cp_10003;
            case 10004:
                return System.SR.Globalization_cp_10004;
            case 10005:
                return System.SR.Globalization_cp_10005;
            case 10006:
                return System.SR.Globalization_cp_10006;
            case 10007:
                return System.SR.Globalization_cp_10007;
            case 10008:
                return System.SR.Globalization_cp_10008;
            case 10010:
                return System.SR.Globalization_cp_10010;
            case 10017:
                return System.SR.Globalization_cp_10017;
            case 10021:
                return System.SR.Globalization_cp_10021;
            case 10029:
                return System.SR.Globalization_cp_10029;
            case 10079:
                return System.SR.Globalization_cp_10079;
            case 10081:
                return System.SR.Globalization_cp_10081;
            case 10082:
                return System.SR.Globalization_cp_10082;
            case 20000:
                return System.SR.Globalization_cp_20000;
            case 20001:
                return System.SR.Globalization_cp_20001;
            case 20002:
                return System.SR.Globalization_cp_20002;
            case 20003:
                return System.SR.Globalization_cp_20003;
            case 20004:
                return System.SR.Globalization_cp_20004;
            case 20005:
                return System.SR.Globalization_cp_20005;
            case 20105:
                return System.SR.Globalization_cp_20105;
            case 20106:
                return System.SR.Globalization_cp_20106;
            case 20107:
                return System.SR.Globalization_cp_20107;
            case 20108:
                return System.SR.Globalization_cp_20108;
            case 20261:
                return System.SR.Globalization_cp_20261;
            case 20269:
                return System.SR.Globalization_cp_20269;
            case 20273:
                return System.SR.Globalization_cp_20273;
            case 20277:
                return System.SR.Globalization_cp_20277;
            case 20278:
                return System.SR.Globalization_cp_20278;
            case 20280:
                return System.SR.Globalization_cp_20280;
            case 20284:
                return System.SR.Globalization_cp_20284;
            case 20285:
                return System.SR.Globalization_cp_20285;
            case 20290:
                return System.SR.Globalization_cp_20290;
            case 20297:
                return System.SR.Globalization_cp_20297;
            case 20420:
                return System.SR.Globalization_cp_20420;
            case 20423:
                return System.SR.Globalization_cp_20423;
            case 20424:
                return System.SR.Globalization_cp_20424;
            case 20833:
                return System.SR.Globalization_cp_20833;
            case 20838:
                return System.SR.Globalization_cp_20838;
            case 20866:
                return System.SR.Globalization_cp_20866;
            case 20871:
                return System.SR.Globalization_cp_20871;
            case 20880:
                return System.SR.Globalization_cp_20880;
            case 20905:
                return System.SR.Globalization_cp_20905;
            case 20924:
                return System.SR.Globalization_cp_20924;
            case 20932:
                return System.SR.Globalization_cp_20932;
            case 20936:
                return System.SR.Globalization_cp_20936;
            case 20949:
                return System.SR.Globalization_cp_20949;
            case 21025:
                return System.SR.Globalization_cp_21025;
            case 21027:
                return System.SR.Globalization_cp_21027;
            case 21866:
                return System.SR.Globalization_cp_21866;
            case 28592:
                return System.SR.Globalization_cp_28592;
            case 28593:
                return System.SR.Globalization_cp_28593;
            case 28594:
                return System.SR.Globalization_cp_28594;
            case 28595:
                return System.SR.Globalization_cp_28595;
            case 28596:
                return System.SR.Globalization_cp_28596;
            case 28597:
                return System.SR.Globalization_cp_28597;
            case 28598:
                return System.SR.Globalization_cp_28598;
            case 28599:
                return System.SR.Globalization_cp_28599;
            case 28603:
                return System.SR.Globalization_cp_28603;
            case 28605:
                return System.SR.Globalization_cp_28605;
            case 29001:
                return System.SR.Globalization_cp_29001;
            case 38598:
                return System.SR.Globalization_cp_38598;
            case 50000:
                return System.SR.Globalization_cp_50000;
            case 50220:
                return System.SR.Globalization_cp_50220;
            case 50221:
                return System.SR.Globalization_cp_50221;
            case 50222:
                return System.SR.Globalization_cp_50222;
            case 50225:
                return System.SR.Globalization_cp_50225;
            case 50227:
                return System.SR.Globalization_cp_50227;
            case 50229:
                return System.SR.Globalization_cp_50229;
            case 50930:
                return System.SR.Globalization_cp_50930;
            case 50931:
                return System.SR.Globalization_cp_50931;
            case 50933:
                return System.SR.Globalization_cp_50933;
            case 50935:
                return System.SR.Globalization_cp_50935;
            case 50937:
                return System.SR.Globalization_cp_50937;
            case 50939:
                return System.SR.Globalization_cp_50939;
            case 51932:
                return System.SR.Globalization_cp_51932;
            case 51936:
                return System.SR.Globalization_cp_51936;
            case 51949:
                return System.SR.Globalization_cp_51949;
            case 52936:
                return System.SR.Globalization_cp_52936;
            case 54936:
                return System.SR.Globalization_cp_54936;
            case 57002:
                return System.SR.Globalization_cp_57002;
            case 57003:
                return System.SR.Globalization_cp_57003;
            case 57004:
                return System.SR.Globalization_cp_57004;
            case 57005:
                return System.SR.Globalization_cp_57005;
            case 57006:
                return System.SR.Globalization_cp_57006;
            case 57007:
                return System.SR.Globalization_cp_57007;
            case 57008:
                return System.SR.Globalization_cp_57008;
            case 57009:
                return System.SR.Globalization_cp_57009;
            case 57010:
                return System.SR.Globalization_cp_57010;
            case 57011:
                return System.SR.Globalization_cp_57011;
            default:
                return null;
            }
        }
    }
}