56 lines
1.4 KiB
C#
56 lines
1.4 KiB
C#
using System;
|
|
using System.IO;
|
|
using System.Text;
|
|
|
|
namespace ln.types.io
|
|
{
|
|
public delegate void LineReceivedDelegate(object sender, string line);
|
|
|
|
public class LineWriter : TextWriter
|
|
{
|
|
public event LineReceivedDelegate LineReceived;
|
|
public override Encoding Encoding => Encoding.UTF8;
|
|
|
|
private void FireLineReceived(string line) => LineReceived?.Invoke(this, line);
|
|
|
|
char[] lineBuffer = new char[8192];
|
|
int cursor = 0;
|
|
|
|
String CurrentLineBuffer => new string(lineBuffer, 0, cursor);
|
|
|
|
public LineWriter()
|
|
{
|
|
}
|
|
|
|
public override void Write(char value)
|
|
{
|
|
lock (this)
|
|
{
|
|
if (value == '\n')
|
|
{
|
|
FireLineReceived(CurrentLineBuffer);
|
|
cursor = 0;
|
|
} else if (cursor < lineBuffer.Length)
|
|
{
|
|
lineBuffer[cursor++] = value;
|
|
}
|
|
}
|
|
}
|
|
|
|
public override void WriteLine() => Write('\n');
|
|
public override void WriteLine(string value)
|
|
{
|
|
lock (this)
|
|
{
|
|
if (cursor > 0)
|
|
{
|
|
value = CurrentLineBuffer + value;
|
|
cursor = 0;
|
|
}
|
|
FireLineReceived(value);
|
|
}
|
|
}
|
|
|
|
}
|
|
}
|