mirror of
https://github.com/gui-cs/Terminal.Gui.git
synced 2026-01-02 01:03:29 +01:00
Merge branch 'ansi-parser' into ansi-parser-net-driver
This commit is contained in:
@@ -5,7 +5,9 @@ namespace Terminal.Gui;
|
||||
|
||||
internal abstract class AnsiResponseParserBase : IAnsiResponseParser
|
||||
{
|
||||
object lockExpectedResponses = new object();
|
||||
protected object lockExpectedResponses = new object();
|
||||
|
||||
protected object lockState = new object ();
|
||||
/// <summary>
|
||||
/// Responses we are expecting to come in.
|
||||
/// </summary>
|
||||
@@ -85,6 +87,19 @@ internal abstract class AnsiResponseParserBase : IAnsiResponseParser
|
||||
Action<object> appendOutput,
|
||||
int inputLength
|
||||
)
|
||||
{
|
||||
lock (lockState)
|
||||
{
|
||||
ProcessInputBaseImpl (getCharAtIndex, getObjectAtIndex, appendOutput, inputLength);
|
||||
}
|
||||
}
|
||||
|
||||
private void ProcessInputBaseImpl (
|
||||
Func<int, char> getCharAtIndex,
|
||||
Func<int, object> getObjectAtIndex,
|
||||
Action<object> appendOutput,
|
||||
int inputLength
|
||||
)
|
||||
{
|
||||
var index = 0; // Tracks position in the input string
|
||||
|
||||
@@ -334,12 +349,17 @@ internal class AnsiResponseParser<T> : AnsiResponseParserBase
|
||||
|
||||
public IEnumerable<Tuple<char, T>> Release ()
|
||||
{
|
||||
foreach (Tuple<char, T> h in HeldToEnumerable())
|
||||
// Lock in case Release is called from different Thread from parse
|
||||
lock (lockState)
|
||||
{
|
||||
yield return h;
|
||||
foreach (Tuple<char, T> h in HeldToEnumerable())
|
||||
{
|
||||
yield return h;
|
||||
}
|
||||
|
||||
ResetState ();
|
||||
}
|
||||
|
||||
ResetState ();
|
||||
}
|
||||
|
||||
private IEnumerable<Tuple<char, T>> HeldToEnumerable ()
|
||||
@@ -356,13 +376,16 @@ internal class AnsiResponseParser<T> : AnsiResponseParserBase
|
||||
/// <param name="persistent"></param>
|
||||
public void ExpectResponseT (string terminator, Action<IEnumerable<Tuple<char,T>>> response, bool persistent)
|
||||
{
|
||||
if (persistent)
|
||||
lock (lockExpectedResponses)
|
||||
{
|
||||
persistentExpectations.Add (new (terminator, (h) => response.Invoke (HeldToEnumerable ())));
|
||||
}
|
||||
else
|
||||
{
|
||||
expectedResponses.Add (new (terminator, (h) => response.Invoke (HeldToEnumerable ())));
|
||||
if (persistent)
|
||||
{
|
||||
persistentExpectations.Add (new (terminator, (h) => response.Invoke (HeldToEnumerable ())));
|
||||
}
|
||||
else
|
||||
{
|
||||
expectedResponses.Add (new (terminator, (h) => response.Invoke (HeldToEnumerable ())));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -405,10 +428,13 @@ internal class AnsiResponseParser : AnsiResponseParserBase
|
||||
|
||||
public string Release ()
|
||||
{
|
||||
var output = heldContent.HeldToString ();
|
||||
ResetState ();
|
||||
lock (lockState)
|
||||
{
|
||||
var output = heldContent.HeldToString ();
|
||||
ResetState ();
|
||||
|
||||
return output;
|
||||
return output;
|
||||
}
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
|
||||
Reference in New Issue
Block a user