internal unsafe override int GetByteCount(char *chars, int charCount, EncoderNLS encoder)
{
char c = '\0';
char *ptr = chars + charCount;
EncoderFallbackBuffer encoderFallbackBuffer = null;
EncoderReplacementFallback encoderReplacementFallback;
if (encoder != null)
{
c = encoder.charLeftOver;
encoderReplacementFallback = (encoder.Fallback as EncoderReplacementFallback);
if (encoder.InternalHasFallbackBuffer)
{
encoderFallbackBuffer = encoder.FallbackBuffer;
if (encoderFallbackBuffer.Remaining > 0 && encoder.m_throwOnOverflow)
{
throw new ArgumentException(Environment.GetResourceString("Argument_EncoderFallbackNotEmpty", new object[]
{
this.EncodingName,
encoder.Fallback.GetType()
}));
}
encoderFallbackBuffer.InternalInitialize(chars, ptr, encoder, false);
}
}
else
{
encoderReplacementFallback = (base.EncoderFallback as EncoderReplacementFallback);
}
if (encoderReplacementFallback != null && encoderReplacementFallback.MaxCharCount == 1)
{
if (c > '\0')
{
charCount++;
}
return(charCount);
}
int num = 0;
if (c > '\0')
{
encoderFallbackBuffer = encoder.FallbackBuffer;
encoderFallbackBuffer.InternalInitialize(chars, ptr, encoder, false);
encoderFallbackBuffer.InternalFallback(c, ref chars);
}
char c2;
while ((c2 = ((encoderFallbackBuffer == null) ? '\0' : encoderFallbackBuffer.InternalGetNextChar())) != '\0' || chars < ptr)
{
if (c2 == '\0')
{
c2 = *chars;
chars++;
}
if (c2 > '\u007f')
{
if (encoderFallbackBuffer == null)
{
if (encoder == null)
{
encoderFallbackBuffer = this.encoderFallback.CreateFallbackBuffer();
}
else
{
encoderFallbackBuffer = encoder.FallbackBuffer;
}
encoderFallbackBuffer.InternalInitialize(ptr - charCount, ptr, encoder, false);
}
encoderFallbackBuffer.InternalFallback(c2, ref chars);
}
else
{
num++;
}
}
return(num);
}