Browse Source

Change to hashmap char since all terminators we ignore are single character

tznind 10 months ago
parent
commit
964196d3b9
1 changed files with 56 additions and 68 deletions
  1. 56 68
      Terminal.Gui/ConsoleDrivers/AnsiResponseParser.cs

+ 56 - 68
Terminal.Gui/ConsoleDrivers/AnsiResponseParser.cs

@@ -7,8 +7,6 @@ internal class AnsiResponseParser
     private readonly StringBuilder held = new ();
     private readonly List<(string terminator, Action<string> response)> expectedResponses = new ();
 
-    private readonly List<Func<string, bool>> _ignorers = new ();
-
     // Enum to manage the parser's state
     private enum ParserState
     {
@@ -19,7 +17,7 @@ internal class AnsiResponseParser
 
     // Current state of the parser
     private ParserState currentState = ParserState.Normal;
-    private readonly HashSet<string> _knownTerminators = new ();
+    private readonly HashSet<char> _knownTerminators = new ();
 
     /*
      * ANSI Input Sequences
@@ -42,64 +40,61 @@ internal class AnsiResponseParser
     {
         // These all are valid terminators on ansi responses,
         // see CSI in https://invisible-island.net/xterm/ctlseqs/ctlseqs.html#h3-Functions-using-CSI-_-ordered-by-the-final-character_s
-        _knownTerminators.Add ("@");
-        _knownTerminators.Add ("A");
-        _knownTerminators.Add ("B");
-        _knownTerminators.Add ("C");
-        _knownTerminators.Add ("D");
-        _knownTerminators.Add ("E");
-        _knownTerminators.Add ("F");
-        _knownTerminators.Add ("G");
-        _knownTerminators.Add ("G");
-        _knownTerminators.Add ("H");
-        _knownTerminators.Add ("I");
-        _knownTerminators.Add ("J");
-        _knownTerminators.Add ("K");
-        _knownTerminators.Add ("L");
-        _knownTerminators.Add ("M");
+        _knownTerminators.Add ('@');
+        _knownTerminators.Add ('A');
+        _knownTerminators.Add ('B');
+        _knownTerminators.Add ('C');
+        _knownTerminators.Add ('D');
+        _knownTerminators.Add ('E');
+        _knownTerminators.Add ('F');
+        _knownTerminators.Add ('G');
+        _knownTerminators.Add ('G');
+        _knownTerminators.Add ('H');
+        _knownTerminators.Add ('I');
+        _knownTerminators.Add ('J');
+        _knownTerminators.Add ('K');
+        _knownTerminators.Add ('L');
+        _knownTerminators.Add ('M');
 
         // No - N or O
-        _knownTerminators.Add ("P");
-        _knownTerminators.Add ("Q");
-        _knownTerminators.Add ("R");
-        _knownTerminators.Add ("S");
-        _knownTerminators.Add ("T");
-        _knownTerminators.Add ("W");
-        _knownTerminators.Add ("X");
-        _knownTerminators.Add ("Z");
-
-        _knownTerminators.Add ("^");
-        _knownTerminators.Add ("`");
-        _knownTerminators.Add ("~");
-
-        _knownTerminators.Add ("a");
-        _knownTerminators.Add ("b");
-        _knownTerminators.Add ("c");
-        _knownTerminators.Add ("d");
-        _knownTerminators.Add ("e");
-        _knownTerminators.Add ("f");
-        _knownTerminators.Add ("g");
-        _knownTerminators.Add ("h");
-        _knownTerminators.Add ("i");
-
-        _knownTerminators.Add ("l");
-        _knownTerminators.Add ("m");
-        _knownTerminators.Add ("n");
-
-        _knownTerminators.Add ("p");
-        _knownTerminators.Add ("q");
-        _knownTerminators.Add ("r");
-        _knownTerminators.Add ("s");
-        _knownTerminators.Add ("t");
-        _knownTerminators.Add ("u");
-        _knownTerminators.Add ("v");
-        _knownTerminators.Add ("w");
-        _knownTerminators.Add ("x");
-        _knownTerminators.Add ("y");
-        _knownTerminators.Add ("z");
-
-        // Add more common ANSI sequences to be ignored
-        _ignorers.Add (s => s.StartsWith ("\x1B[<") && s.EndsWith ("M")); // Mouse event
+        _knownTerminators.Add ('P');
+        _knownTerminators.Add ('Q');
+        _knownTerminators.Add ('R');
+        _knownTerminators.Add ('S');
+        _knownTerminators.Add ('T');
+        _knownTerminators.Add ('W');
+        _knownTerminators.Add ('X');
+        _knownTerminators.Add ('Z');
+
+        _knownTerminators.Add ('^');
+        _knownTerminators.Add ('`');
+        _knownTerminators.Add ('~');
+
+        _knownTerminators.Add ('a');
+        _knownTerminators.Add ('b');
+        _knownTerminators.Add ('c');
+        _knownTerminators.Add ('d');
+        _knownTerminators.Add ('e');
+        _knownTerminators.Add ('f');
+        _knownTerminators.Add ('g');
+        _knownTerminators.Add ('h');
+        _knownTerminators.Add ('i');
+
+        _knownTerminators.Add ('l');
+        _knownTerminators.Add ('m');
+        _knownTerminators.Add ('n');
+
+        _knownTerminators.Add ('p');
+        _knownTerminators.Add ('q');
+        _knownTerminators.Add ('r');
+        _knownTerminators.Add ('s');
+        _knownTerminators.Add ('t');
+        _knownTerminators.Add ('u');
+        _knownTerminators.Add ('v');
+        _knownTerminators.Add ('w');
+        _knownTerminators.Add ('x');
+        _knownTerminators.Add ('y');
+        _knownTerminators.Add ('z');
 
         // Add more if necessary
     }
@@ -205,17 +200,10 @@ internal class AnsiResponseParser
             return string.Empty;
         }
 
-        if (_knownTerminators.Any (cur.EndsWith) && cur.StartsWith (EscSeqUtils.CSI))
+        if (_knownTerminators.Contains (cur.Last ()) && cur.StartsWith (EscSeqUtils.CSI))
         {
             // Detected a response that we were not expecting
-            return held.ToString ();
-        }
-
-        // Handle common ANSI sequences (such as mouse input or arrow keys)
-        if (_ignorers.Any (m => m.Invoke (held.ToString ())))
-        {
-            // Detected mouse input, release it without triggering the delegate
-            return held.ToString ();
+            return cur;
         }
 
         // Add more cases here for other standard sequences (like arrow keys, function keys, etc.)