Better shimming in NoPreambleEncoding

This commit is contained in:
Tyrrrz
2021-07-09 22:00:31 +03:00
parent df73a0bfe8
commit 8abd7219a1
2 changed files with 97 additions and 6 deletions

View File

@@ -18,7 +18,7 @@ namespace CliFx.Infrastructure
/// Initializes an instance of <see cref="ConsoleWriter"/>.
/// </summary>
public ConsoleWriter(IConsole console, Stream stream, Encoding encoding)
: base(stream, encoding, 256)
: base(stream, encoding.WithoutPreamble(), 256)
{
Console = console;
}
@@ -27,7 +27,7 @@ namespace CliFx.Infrastructure
/// Initializes an instance of <see cref="ConsoleWriter"/>.
/// </summary>
public ConsoleWriter(IConsole console, Stream stream)
: this(console, stream, System.Console.OutputEncoding.WithoutPreamble())
: this(console, stream, System.Console.OutputEncoding)
{
}
}

View File

@@ -6,32 +6,111 @@ namespace CliFx.Utils
{
// Adapted from:
// https://github.com/dotnet/runtime/blob/01b7e73cd378145264a7cb7a09365b41ed42b240/src/libraries/Common/src/System/Text/ConsoleEncoding.cs
// Also see:
// https://source.dot.net/#System.Console/ConsoleEncoding.cs,5eedd083a4a4f4a2
internal class NoPreambleEncoding : Encoding
{
private readonly Encoding _underlyingEncoding;
public NoPreambleEncoding(Encoding underlyingEncoding) =>
_underlyingEncoding = underlyingEncoding;
[ExcludeFromCodeCoverage]
public override string EncodingName => _underlyingEncoding.EncodingName;
public override byte[] GetPreamble() =>
Array.Empty<byte>();
[ExcludeFromCodeCoverage]
public override string BodyName => _underlyingEncoding.BodyName;
[ExcludeFromCodeCoverage]
public override int CodePage => _underlyingEncoding.CodePage;
[ExcludeFromCodeCoverage]
public override int WindowsCodePage => _underlyingEncoding.WindowsCodePage;
[ExcludeFromCodeCoverage]
public override string HeaderName => _underlyingEncoding.HeaderName;
[ExcludeFromCodeCoverage]
public override string WebName => _underlyingEncoding.WebName;
[ExcludeFromCodeCoverage]
public override bool IsBrowserDisplay => _underlyingEncoding.IsBrowserDisplay;
[ExcludeFromCodeCoverage]
public override bool IsBrowserSave => _underlyingEncoding.IsBrowserSave;
[ExcludeFromCodeCoverage]
public override bool IsSingleByte => _underlyingEncoding.IsSingleByte;
[ExcludeFromCodeCoverage]
public override bool IsMailNewsDisplay => _underlyingEncoding.IsMailNewsDisplay;
[ExcludeFromCodeCoverage]
public override bool IsMailNewsSave => _underlyingEncoding.IsMailNewsSave;
public NoPreambleEncoding(Encoding underlyingEncoding)
: base(
underlyingEncoding.CodePage,
underlyingEncoding.EncoderFallback,
underlyingEncoding.DecoderFallback
)
{
_underlyingEncoding = underlyingEncoding;
}
// This is the only part that changes
public override byte[] GetPreamble() => Array.Empty<byte>();
[ExcludeFromCodeCoverage]
public override int GetByteCount(char[] chars, int index, int count) =>
_underlyingEncoding.GetByteCount(chars, index, count);
[ExcludeFromCodeCoverage]
public override int GetByteCount(char[] chars) => _underlyingEncoding.GetByteCount(chars);
[ExcludeFromCodeCoverage]
public override int GetByteCount(string s) => _underlyingEncoding.GetByteCount(s);
[ExcludeFromCodeCoverage]
public override int GetBytes(char[] chars, int charIndex, int charCount, byte[] bytes, int byteIndex) =>
_underlyingEncoding.GetBytes(chars, charIndex, charCount, bytes, byteIndex);
[ExcludeFromCodeCoverage]
public override byte[] GetBytes(char[] chars) => _underlyingEncoding.GetBytes(chars);
[ExcludeFromCodeCoverage]
public override byte[] GetBytes(char[] chars, int index, int count) =>
_underlyingEncoding.GetBytes(chars, index, count);
[ExcludeFromCodeCoverage]
public override byte[] GetBytes(string s) => _underlyingEncoding.GetBytes(s);
[ExcludeFromCodeCoverage]
public override int GetBytes(string s, int charIndex, int charCount, byte[] bytes, int byteIndex) =>
_underlyingEncoding.GetBytes(s, charIndex, charCount, bytes, byteIndex);
[ExcludeFromCodeCoverage]
public override int GetCharCount(byte[] bytes, int index, int count) =>
_underlyingEncoding.GetCharCount(bytes, index, count);
[ExcludeFromCodeCoverage]
public override int GetCharCount(byte[] bytes) => _underlyingEncoding.GetCharCount(bytes);
[ExcludeFromCodeCoverage]
public override int GetChars(byte[] bytes, int byteIndex, int byteCount, char[] chars, int charIndex) =>
_underlyingEncoding.GetChars(bytes, byteIndex, byteCount, chars, charIndex);
[ExcludeFromCodeCoverage]
public override char[] GetChars(byte[] bytes) => _underlyingEncoding.GetChars(bytes);
[ExcludeFromCodeCoverage]
public override char[] GetChars(byte[] bytes, int index, int count) =>
_underlyingEncoding.GetChars(bytes, index, count);
[ExcludeFromCodeCoverage]
public override string GetString(byte[] bytes) => _underlyingEncoding.GetString(bytes);
[ExcludeFromCodeCoverage]
public override string GetString(byte[] bytes, int index, int count) =>
_underlyingEncoding.GetString(bytes, index, count);
[ExcludeFromCodeCoverage]
public override int GetMaxByteCount(int charCount) =>
_underlyingEncoding.GetMaxByteCount(charCount);
@@ -39,6 +118,18 @@ namespace CliFx.Utils
[ExcludeFromCodeCoverage]
public override int GetMaxCharCount(int byteCount) =>
_underlyingEncoding.GetMaxCharCount(byteCount);
[ExcludeFromCodeCoverage]
public override bool IsAlwaysNormalized(NormalizationForm form) => _underlyingEncoding.IsAlwaysNormalized(form);
[ExcludeFromCodeCoverage]
public override Encoder GetEncoder() => _underlyingEncoding.GetEncoder();
[ExcludeFromCodeCoverage]
public override Decoder GetDecoder() => _underlyingEncoding.GetDecoder();
[ExcludeFromCodeCoverage]
public override object Clone() => new NoPreambleEncoding((Encoding) base.Clone());
}
internal static class NoPreambleEncodingExtensions