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); }