Пример #1
0
        internal override unsafe int GetChars(byte *bytes, int byteCount, char *chars, int charCount, DecoderNLS baseDecoder)
        {
            ISCIIEncoding.ISCIIDecoder  isciiDecoder       = (ISCIIEncoding.ISCIIDecoder)baseDecoder;
            Encoding.EncodingCharBuffer encodingCharBuffer = new Encoding.EncodingCharBuffer((Encoding)this, (DecoderNLS)isciiDecoder, chars, charCount, bytes, byteCount);
            int  index1 = this.defaultCodePage;
            bool flag1  = false;
            bool flag2  = false;
            bool flag3  = false;
            char ch1    = char.MinValue;
            char ch2    = char.MinValue;

            if (isciiDecoder != null)
            {
                index1 = isciiDecoder.currentCodePage;
                flag1  = isciiDecoder.bLastATR;
                flag2  = isciiDecoder.bLastVirama;
                flag3  = isciiDecoder.bLastDevenagariStressAbbr;
                ch1    = isciiDecoder.cLastCharForNextNukta;
                ch2    = isciiDecoder.cLastCharForNoNextNukta;
            }
            bool flag4  = flag2 | flag1 | flag3 | (uint)ch1 > 0U;
            int  index2 = -1;

            if (index1 >= 2 && index1 <= 11)
            {
                index2 = ISCIIEncoding.IndicMappingIndex[index1];
            }
            while (encodingCharBuffer.MoreData)
            {
                byte nextByte = encodingCharBuffer.GetNextByte();
                if (flag4)
                {
                    flag4 = false;
                    if (flag1)
                    {
                        if ((int)nextByte >= 66 && (int)nextByte <= 75)
                        {
                            index1 = (int)nextByte & 15;
                            index2 = ISCIIEncoding.IndicMappingIndex[index1];
                            flag1  = false;
                            continue;
                        }
                        if ((int)nextByte == 64)
                        {
                            index1 = this.defaultCodePage;
                            index2 = -1;
                            if (index1 >= 2 && index1 <= 11)
                            {
                                index2 = ISCIIEncoding.IndicMappingIndex[index1];
                            }
                            flag1 = false;
                            continue;
                        }
                        if ((int)nextByte == 65)
                        {
                            index1 = this.defaultCodePage;
                            index2 = -1;
                            if (index1 >= 2 && index1 <= 11)
                            {
                                index2 = ISCIIEncoding.IndicMappingIndex[index1];
                            }
                            flag1 = false;
                            continue;
                        }
                        if (encodingCharBuffer.Fallback((byte)239))
                        {
                            flag1 = false;
                        }
                        else
                        {
                            break;
                        }
                    }
                    else if (flag2)
                    {
                        if ((int)nextByte == 232)
                        {
                            if (encodingCharBuffer.AddChar('\x200C'))
                            {
                                flag2 = false;
                                continue;
                            }
                            break;
                        }
                        if ((int)nextByte == 233)
                        {
                            if (encodingCharBuffer.AddChar('\x200D'))
                            {
                                flag2 = false;
                                continue;
                            }
                            break;
                        }
                        flag2 = false;
                    }
                    else if (flag3)
                    {
                        if ((int)nextByte == 184)
                        {
                            if (encodingCharBuffer.AddChar('॒'))
                            {
                                flag3 = false;
                                continue;
                            }
                            break;
                        }
                        if ((int)nextByte == 191)
                        {
                            if (encodingCharBuffer.AddChar('॰'))
                            {
                                flag3 = false;
                                continue;
                            }
                            break;
                        }
                        if (encodingCharBuffer.Fallback((byte)240))
                        {
                            flag3 = false;
                        }
                        else
                        {
                            break;
                        }
                    }
                    else
                    {
                        if ((int)nextByte == 233)
                        {
                            if (encodingCharBuffer.AddChar(ch1))
                            {
                                ch1 = ch2 = char.MinValue;
                                continue;
                            }
                            break;
                        }
                        if (encodingCharBuffer.AddChar(ch2))
                        {
                            ch1 = ch2 = char.MinValue;
                        }
                        else
                        {
                            break;
                        }
                    }
                }
                if ((int)nextByte < 160)
                {
                    if (!encodingCharBuffer.AddChar((char)nextByte))
                    {
                        break;
                    }
                }
                else if ((int)nextByte == 239)
                {
                    flag1 = flag4 = true;
                }
                else
                {
                    char ch3 = ISCIIEncoding.IndicMapping[index2, 0, (int)nextByte - 160];
                    char ch4 = ISCIIEncoding.IndicMapping[index2, 1, (int)nextByte - 160];
                    if ((int)ch4 == 0 || (int)nextByte == 233)
                    {
                        if ((int)ch3 == 0)
                        {
                            if (!encodingCharBuffer.Fallback(nextByte))
                            {
                                break;
                            }
                        }
                        else if (!encodingCharBuffer.AddChar(ch3))
                        {
                            break;
                        }
                    }
                    else if ((int)nextByte == 232)
                    {
                        if (encodingCharBuffer.AddChar(ch3))
                        {
                            flag2 = flag4 = true;
                        }
                        else
                        {
                            break;
                        }
                    }
                    else if (((int)ch4 & 61440) == 0)
                    {
                        flag4 = true;
                        ch1   = ch4;
                        ch2   = ch3;
                    }
                    else
                    {
                        flag3 = flag4 = true;
                    }
                }
            }
            if (isciiDecoder == null || isciiDecoder.MustFlush)
            {
                if (flag1)
                {
                    if (encodingCharBuffer.Fallback((byte)239))
                    {
                        flag1 = false;
                    }
                    else
                    {
                        int num1 = (int)encodingCharBuffer.GetNextByte();
                    }
                }
                else if (flag3)
                {
                    if (encodingCharBuffer.Fallback((byte)240))
                    {
                        flag3 = false;
                    }
                    else
                    {
                        int num2 = (int)encodingCharBuffer.GetNextByte();
                    }
                }
                else if ((int)ch2 != 0)
                {
                    if (encodingCharBuffer.AddChar(ch2))
                    {
                        ch2 = ch1 = char.MinValue;
                    }
                    else
                    {
                        int num3 = (int)encodingCharBuffer.GetNextByte();
                    }
                }
            }
            if (isciiDecoder != null && (IntPtr)chars != IntPtr.Zero)
            {
                if (((!isciiDecoder.MustFlush ? 1 : ((uint)ch2 > 0U ? 1 : 0)) | (flag1 ? 1 : 0) | (flag3 ? 1 : 0)) != 0)
                {
                    isciiDecoder.currentCodePage           = index1;
                    isciiDecoder.bLastVirama               = flag2;
                    isciiDecoder.bLastATR                  = flag1;
                    isciiDecoder.bLastDevenagariStressAbbr = flag3;
                    isciiDecoder.cLastCharForNextNukta     = ch1;
                    isciiDecoder.cLastCharForNoNextNukta   = ch2;
                }
                else
                {
                    isciiDecoder.currentCodePage           = this.defaultCodePage;
                    isciiDecoder.bLastVirama               = false;
                    isciiDecoder.bLastATR                  = false;
                    isciiDecoder.bLastDevenagariStressAbbr = false;
                    isciiDecoder.cLastCharForNextNukta     = char.MinValue;
                    isciiDecoder.cLastCharForNoNextNukta   = char.MinValue;
                }
                isciiDecoder.m_bytesUsed = encodingCharBuffer.BytesUsed;
            }
            return(encodingCharBuffer.Count);
        }