From 1794d4ed8a468b3235eb870ffcdf62ab1ebd7867 Mon Sep 17 00:00:00 2001 From: wagesj45 Date: Tue, 30 Jun 2026 03:03:11 -0500 Subject: [PATCH] Add interactive exit function --- src/cs-mic-cli/ExitRequestedState.cs | 7 +++++ src/cs-mic-cli/Functions/Exit.cs | 45 ++++++++++++++++++++++++++++ src/cs-mic-cli/Program.cs | 18 +++++++---- 3 files changed, 64 insertions(+), 6 deletions(-) create mode 100644 src/cs-mic-cli/ExitRequestedState.cs create mode 100644 src/cs-mic-cli/Functions/Exit.cs diff --git a/src/cs-mic-cli/ExitRequestedState.cs b/src/cs-mic-cli/ExitRequestedState.cs new file mode 100644 index 0000000..ba93323 --- /dev/null +++ b/src/cs-mic-cli/ExitRequestedState.cs @@ -0,0 +1,7 @@ +namespace cs_mic_cli +{ + internal class ExitRequestedState + { + public bool Requested { get; set; } + } +} diff --git a/src/cs-mic-cli/Functions/Exit.cs b/src/cs-mic-cli/Functions/Exit.cs new file mode 100644 index 0000000..9e4b7b9 --- /dev/null +++ b/src/cs-mic-cli/Functions/Exit.cs @@ -0,0 +1,45 @@ +using CSMic; + +namespace cs_mic_cli.Functions +{ + internal class Exit : ICodedFunction + { + private readonly ExitRequestedState exitRequestedState; + + public string Name + { + get + { + return "exit"; + } + } + + public IEnumerable ExpectedArguments + { + get + { + yield break; + } + } + + public FunctionValue ReturnValue + { + get + { + return FunctionValue.NONE; + } + } + + public Exit(ExitRequestedState exitRequestedState) + { + this.exitRequestedState = exitRequestedState; + } + + public FunctionValue Execute(params FunctionArgument[] args) + { + this.exitRequestedState.Requested = true; + + return FunctionValue.NONE; + } + } +} diff --git a/src/cs-mic-cli/Program.cs b/src/cs-mic-cli/Program.cs index ca6ebaf..4c6a82e 100644 --- a/src/cs-mic-cli/Program.cs +++ b/src/cs-mic-cli/Program.cs @@ -71,16 +71,17 @@ namespace cs_mic_cli if (string.IsNullOrWhiteSpace(fullExpression) || options.Interactive) { // console mode - bool exitRequested = false; + var exitRequestedState = new ExitRequestedState(); + inputInterpreter.RegisterFunction(new Exit(exitRequestedState)); Console.CancelKeyPress += (_, e) => { - e.Cancel = true; - exitRequested = true; + e.Cancel = false; + exitRequestedState.Requested = true; Console.WriteLine(); }; - while (!exitRequested) + while (!exitRequestedState.Requested) { Console.Write("csmic> "); @@ -92,7 +93,7 @@ namespace cs_mic_cli break; } - Calculate(inputInterpreter, options, fullExpression); + Calculate(inputInterpreter, options, fullExpression, exitRequestedState); } } else @@ -104,10 +105,15 @@ namespace cs_mic_cli return 0; } - private static void Calculate(InputInterpreter inputInterpreter, Options options, string expression) + private static void Calculate(InputInterpreter inputInterpreter, Options options, string expression, ExitRequestedState? exitRequestedState = null) { inputInterpreter.Interpret(expression); + if (exitRequestedState?.Requested == true) + { + return; + } + Console.WriteLine(inputInterpreter.NumericValue); if(options.Verbose) {