<PackageReference Include="System.Text.Encoding.CodePages" Version="6.0.0-rc.1.21451.13" />

EncoderFallbackBufferHelper

namespace System.Text { internal struct EncoderFallbackBufferHelper { internal unsafe char* charStart; internal unsafe char* charEnd; internal System.Text.EncoderNLS encoder; internal bool setEncoder; internal bool bUsedEncoder; internal bool bFallingBack; internal int iRecursionCount; private const int iMaxRecursion = 250; private readonly EncoderFallbackBuffer _fallbackBuffer; public unsafe EncoderFallbackBufferHelper(EncoderFallbackBuffer fallbackBuffer) { _fallbackBuffer = fallbackBuffer; bFallingBack = (bUsedEncoder = (setEncoder = false)); iRecursionCount = 0; charEnd = (charStart = null); encoder = null; } internal unsafe void InternalReset() { charStart = null; bFallingBack = false; iRecursionCount = 0; _fallbackBuffer.Reset(); } internal unsafe void InternalInitialize(char* _charStart, char* _charEnd, System.Text.EncoderNLS _encoder, bool _setEncoder) { charStart = _charStart; charEnd = _charEnd; encoder = _encoder; setEncoder = _setEncoder; bUsedEncoder = false; bFallingBack = false; iRecursionCount = 0; } internal char InternalGetNextChar() { char nextChar = _fallbackBuffer.GetNextChar(); bFallingBack = (nextChar != ''); if (nextChar == '') iRecursionCount = 0; return nextChar; } internal unsafe bool InternalFallback(char ch, ref char* chars) { int index = (int)(chars - charStart) - 1; if (char.IsHighSurrogate(ch)) { if (chars >= charEnd) { if (encoder != null && !encoder.MustFlush) { if (setEncoder) { bUsedEncoder = true; encoder.charLeftOver = ch; } bFallingBack = false; return false; } } else { char c = *chars; if (char.IsLowSurrogate(c)) { if (bFallingBack && iRecursionCount++ > 250) ThrowLastCharRecursive(char.ConvertToUtf32(ch, c)); chars++; bFallingBack = _fallbackBuffer.Fallback(ch, c, index); return bFallingBack; } } } if (bFallingBack && iRecursionCount++ > 250) ThrowLastCharRecursive(ch); bFallingBack = _fallbackBuffer.Fallback(ch, index); return bFallingBack; } internal void ThrowLastCharRecursive(int charRecursive) { throw new ArgumentException(System.SR.Format(System.SR.Argument_RecursiveFallback, charRecursive), "chars"); } } }