internal override unsafe int GetByteCount(char *chars, int count, EncoderNLS encoder)
{
char ch2;
base.CheckMemorySection();
char charLeftOver = '\0';
if (encoder != null)
{
charLeftOver = encoder.charLeftOver;
if (encoder.InternalHasFallbackBuffer && (encoder.FallbackBuffer.Remaining > 0))
{
throw new ArgumentException(Environment.GetResourceString("Argument_EncoderFallbackNotEmpty", new object[] { this.EncodingName, encoder.Fallback.GetType() }));
}
}
int num = 0;
char *charEnd = chars + count;
EncoderFallbackBuffer fallbackBuffer = null;
if (charLeftOver > '\0')
{
fallbackBuffer = encoder.FallbackBuffer;
fallbackBuffer.InternalInitialize(chars, charEnd, encoder, false);
fallbackBuffer.InternalFallback(charLeftOver, ref chars);
}
while (((ch2 = (fallbackBuffer == null) ? '\0' : fallbackBuffer.InternalGetNextChar()) != '\0') || (chars < charEnd))
{
if (ch2 == '\0')
{
ch2 = chars[0];
chars++;
}
ushort num2 = this.mapUnicodeToBytes[ch2];
if ((num2 == 0) && (ch2 != '\0'))
{
if (fallbackBuffer == null)
{
if (encoder == null)
{
fallbackBuffer = base.encoderFallback.CreateFallbackBuffer();
}
else
{
fallbackBuffer = encoder.FallbackBuffer;
}
fallbackBuffer.InternalInitialize(charEnd - count, charEnd, encoder, false);
}
fallbackBuffer.InternalFallback(ch2, ref chars);
}
else
{
num++;
if (num2 >= 0x100)
{
num++;
}
}
}
return(num);
}