From c6210f75cac186f644c899ea54f7ad9d3e0f733a Mon Sep 17 00:00:00 2001 From: Patrik Svensson Date: Fri, 1 Jan 2021 22:54:44 +0100 Subject: [PATCH] Prevent endless loop in tokenization Closes #198 --- .../Internal/Parsing/CommandTreeTokenizer.cs | 25 ++++++++++++------- .../Cli/Internal/TextBuffer.cs | 6 +++++ 2 files changed, 22 insertions(+), 9 deletions(-) diff --git a/src/Spectre.Console/Cli/Internal/Parsing/CommandTreeTokenizer.cs b/src/Spectre.Console/Cli/Internal/Parsing/CommandTreeTokenizer.cs index a70a832..6495b94 100644 --- a/src/Spectre.Console/Cli/Internal/Parsing/CommandTreeTokenizer.cs +++ b/src/Spectre.Console/Cli/Internal/Parsing/CommandTreeTokenizer.cs @@ -63,16 +63,23 @@ namespace Spectre.Console.Cli.Internal } var character = reader.Peek(); - if (!char.IsWhiteSpace(character)) + + // Eat whitespace + if (char.IsWhiteSpace(character)) { - if (character == '-') - { - tokens.AddRange(ScanOptions(context, reader)); - } - else - { - tokens.Add(ScanString(context, reader)); - } + reader.Consume(); + continue; + } + + if (character == '-') + { + // Option + tokens.AddRange(ScanOptions(context, reader)); + } + else + { + // Command or argument + tokens.Add(ScanString(context, reader)); } // Flush remaining tokens diff --git a/src/Spectre.Console/Cli/Internal/TextBuffer.cs b/src/Spectre.Console/Cli/Internal/TextBuffer.cs index 6237337..41ee2c2 100644 --- a/src/Spectre.Console/Cli/Internal/TextBuffer.cs +++ b/src/Spectre.Console/Cli/Internal/TextBuffer.cs @@ -51,6 +51,12 @@ namespace Spectre.Console.Cli.Internal return true; } + public void Consume() + { + EnsureNotAtEnd(); + Read(); + } + public void Consume(char character) { EnsureNotAtEnd();