XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet

XFESystem

【Rust】XFE系统,基于Rust和汇编

公开
关注 0 Fork 0 Star 0
UTF-8
using System.Text;

namespace XFESystem.Console;

/// <summary>A serialized TextWriter for a graphical terminal model. It does not replace runtime console PAL calls.</summary>
public sealed class TerminalTextWriter(TerminalBuffer buffer) : TextWriter
{
    private readonly object gate = new();

    public TerminalBuffer Buffer { get; } = buffer ?? throw new ArgumentNullException(nameof(buffer));
    public override Encoding Encoding => Encoding.UTF8;

    public override void Write(char value)
    {
        lock (gate)
        {
            Span<char> character = stackalloc char[1];
            character[0] = value;
            Buffer.Write(character);
        }
    }

    public override void Write(string? value)
    {
        lock (gate) Buffer.Write(value);
    }

    public override void Write(ReadOnlySpan<char> value)
    {
        lock (gate) Buffer.Write(value);
    }

    public override void WriteLine(string? value)
    {
        lock (gate)
        {
            Buffer.Write(value);
            Buffer.Write("\r\n");
        }
    }

    // TextWriter's parameterless implementation uses the host NewLine. A
    // native Unix-target runtime supplies LF, while VT LF preserves column;
    // a logical writer line must return to column zero on every platform.
    public override void WriteLine()
    {
        lock (gate) Buffer.Write("\r\n");
    }

    public override void WriteLine(ReadOnlySpan<char> value)
    {
        lock (gate)
        {
            Buffer.Write(value);
            Buffer.Write("\r\n");
        }
    }

    public TerminalSnapshot Snapshot()
    {
        lock (gate) return Buffer.Snapshot();
    }

    public void Complete()
    {
        lock (gate) Buffer.Complete();
    }
}