From 79c76d67ce328debc99b57172b28a695972cc080 Mon Sep 17 00:00:00 2001 From: Ali Mohammad Pur Date: Tue, 18 Apr 2023 16:45:11 +0330 Subject: [PATCH] Shell: Add the 'break' and 'continue' POSIX builtins These only support n=1 for now. --- Userland/Shell/Builtin.cpp | 50 +++++++++++++++++++++++++++++ Userland/Shell/Shell.h | 64 ++++++++++++++++++++------------------ 2 files changed, 83 insertions(+), 31 deletions(-) diff --git a/Userland/Shell/Builtin.cpp b/Userland/Shell/Builtin.cpp index 0916d2f8a3..143b63ceba 100644 --- a/Userland/Shell/Builtin.cpp +++ b/Userland/Shell/Builtin.cpp @@ -215,6 +215,56 @@ ErrorOr Shell::builtin_unalias(Main::Arguments arguments) return failed ? 1 : 0; } +ErrorOr Shell::builtin_break(Main::Arguments arguments) +{ + if (!m_in_posix_mode) { + raise_error(ShellError::EvaluatedSyntaxError, "break: Invalid use of builtin break in non-POSIX mode"); + return 1; + } + + unsigned count = 1; + + Core::ArgsParser parser; + parser.add_positional_argument(count, "Number of loops to 'break' out of", "count", Core::ArgsParser::Required::No); + + if (!parser.parse(arguments, Core::ArgsParser::FailureBehavior::PrintUsage)) + return 1; + + if (count != 1) { + raise_error(ShellError::EvaluatedSyntaxError, "break: count must be equal to 1 (NYI)"); + return 1; + } + + raise_error(ShellError::InternalControlFlowBreak, "POSIX break"); + + return 0; +} + +ErrorOr Shell::builtin_continue(Main::Arguments arguments) +{ + if (!m_in_posix_mode) { + raise_error(ShellError::EvaluatedSyntaxError, "break: Invalid use of builtin continue in non-POSIX mode"); + return 1; + } + + unsigned count = 1; + + Core::ArgsParser parser; + parser.add_positional_argument(count, "Number of loops to 'continue' out of", "count", Core::ArgsParser::Required::No); + + if (!parser.parse(arguments, Core::ArgsParser::FailureBehavior::PrintUsage)) + return 1; + + if (count != 0) { + raise_error(ShellError::EvaluatedSyntaxError, "continue: count must be equal to 1 (NYI)"); + return 1; + } + + raise_error(ShellError::InternalControlFlowContinue, "POSIX continue"); + + return 0; +} + ErrorOr Shell::builtin_bg(Main::Arguments arguments) { int job_id = -1; diff --git a/Userland/Shell/Shell.h b/Userland/Shell/Shell.h index 19276a9e49..c875446de2 100644 --- a/Userland/Shell/Shell.h +++ b/Userland/Shell/Shell.h @@ -23,37 +23,39 @@ #include #include -#define ENUMERATE_SHELL_BUILTINS() \ - __ENUMERATE_SHELL_BUILTIN(alias) \ - __ENUMERATE_SHELL_BUILTIN(where) \ - __ENUMERATE_SHELL_BUILTIN(cd) \ - __ENUMERATE_SHELL_BUILTIN(cdh) \ - __ENUMERATE_SHELL_BUILTIN(pwd) \ - __ENUMERATE_SHELL_BUILTIN(type) \ - __ENUMERATE_SHELL_BUILTIN(exec) \ - __ENUMERATE_SHELL_BUILTIN(exit) \ - __ENUMERATE_SHELL_BUILTIN(export) \ - __ENUMERATE_SHELL_BUILTIN(glob) \ - __ENUMERATE_SHELL_BUILTIN(unalias) \ - __ENUMERATE_SHELL_BUILTIN(unset) \ - __ENUMERATE_SHELL_BUILTIN(history) \ - __ENUMERATE_SHELL_BUILTIN(umask) \ - __ENUMERATE_SHELL_BUILTIN(not ) \ - __ENUMERATE_SHELL_BUILTIN(dirs) \ - __ENUMERATE_SHELL_BUILTIN(pushd) \ - __ENUMERATE_SHELL_BUILTIN(popd) \ - __ENUMERATE_SHELL_BUILTIN(setopt) \ - __ENUMERATE_SHELL_BUILTIN(shift) \ - __ENUMERATE_SHELL_BUILTIN(source) \ - __ENUMERATE_SHELL_BUILTIN(time) \ - __ENUMERATE_SHELL_BUILTIN(jobs) \ - __ENUMERATE_SHELL_BUILTIN(disown) \ - __ENUMERATE_SHELL_BUILTIN(fg) \ - __ENUMERATE_SHELL_BUILTIN(bg) \ - __ENUMERATE_SHELL_BUILTIN(wait) \ - __ENUMERATE_SHELL_BUILTIN(dump) \ - __ENUMERATE_SHELL_BUILTIN(kill) \ - __ENUMERATE_SHELL_BUILTIN(noop) \ +#define ENUMERATE_SHELL_BUILTINS() \ + __ENUMERATE_SHELL_BUILTIN(alias) \ + __ENUMERATE_SHELL_BUILTIN(where) \ + __ENUMERATE_SHELL_BUILTIN(cd) \ + __ENUMERATE_SHELL_BUILTIN(cdh) \ + __ENUMERATE_SHELL_BUILTIN(pwd) \ + __ENUMERATE_SHELL_BUILTIN(type) \ + __ENUMERATE_SHELL_BUILTIN(exec) \ + __ENUMERATE_SHELL_BUILTIN(exit) \ + __ENUMERATE_SHELL_BUILTIN(export) \ + __ENUMERATE_SHELL_BUILTIN(glob) \ + __ENUMERATE_SHELL_BUILTIN(unalias) \ + __ENUMERATE_SHELL_BUILTIN(unset) \ + __ENUMERATE_SHELL_BUILTIN(history) \ + __ENUMERATE_SHELL_BUILTIN(umask) \ + __ENUMERATE_SHELL_BUILTIN(not ) \ + __ENUMERATE_SHELL_BUILTIN(dirs) \ + __ENUMERATE_SHELL_BUILTIN(pushd) \ + __ENUMERATE_SHELL_BUILTIN(popd) \ + __ENUMERATE_SHELL_BUILTIN(setopt) \ + __ENUMERATE_SHELL_BUILTIN(shift) \ + __ENUMERATE_SHELL_BUILTIN(source) \ + __ENUMERATE_SHELL_BUILTIN(time) \ + __ENUMERATE_SHELL_BUILTIN(jobs) \ + __ENUMERATE_SHELL_BUILTIN(disown) \ + __ENUMERATE_SHELL_BUILTIN(fg) \ + __ENUMERATE_SHELL_BUILTIN(bg) \ + __ENUMERATE_SHELL_BUILTIN(wait) \ + __ENUMERATE_SHELL_BUILTIN(dump) \ + __ENUMERATE_SHELL_BUILTIN(kill) \ + __ENUMERATE_SHELL_BUILTIN(noop) \ + __ENUMERATE_SHELL_BUILTIN(break) \ + __ENUMERATE_SHELL_BUILTIN(continue) \ __ENUMERATE_SHELL_BUILTIN(argsparser_parse) #define ENUMERATE_SHELL_OPTIONS() \