1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-25 05:47:35 +00:00

Shell: Add the 'break' and 'continue' POSIX builtins

These only support n=1 for now.
This commit is contained in:
Ali Mohammad Pur 2023-04-18 16:45:11 +03:30 committed by Ali Mohammad Pur
parent 0318ac5ce4
commit 79c76d67ce
2 changed files with 83 additions and 31 deletions

View file

@ -215,6 +215,56 @@ ErrorOr<int> Shell::builtin_unalias(Main::Arguments arguments)
return failed ? 1 : 0; return failed ? 1 : 0;
} }
ErrorOr<int> 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<int> 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<int> Shell::builtin_bg(Main::Arguments arguments) ErrorOr<int> Shell::builtin_bg(Main::Arguments arguments)
{ {
int job_id = -1; int job_id = -1;

View file

@ -23,37 +23,39 @@
#include <LibMain/Main.h> #include <LibMain/Main.h>
#include <termios.h> #include <termios.h>
#define ENUMERATE_SHELL_BUILTINS() \ #define ENUMERATE_SHELL_BUILTINS() \
__ENUMERATE_SHELL_BUILTIN(alias) \ __ENUMERATE_SHELL_BUILTIN(alias) \
__ENUMERATE_SHELL_BUILTIN(where) \ __ENUMERATE_SHELL_BUILTIN(where) \
__ENUMERATE_SHELL_BUILTIN(cd) \ __ENUMERATE_SHELL_BUILTIN(cd) \
__ENUMERATE_SHELL_BUILTIN(cdh) \ __ENUMERATE_SHELL_BUILTIN(cdh) \
__ENUMERATE_SHELL_BUILTIN(pwd) \ __ENUMERATE_SHELL_BUILTIN(pwd) \
__ENUMERATE_SHELL_BUILTIN(type) \ __ENUMERATE_SHELL_BUILTIN(type) \
__ENUMERATE_SHELL_BUILTIN(exec) \ __ENUMERATE_SHELL_BUILTIN(exec) \
__ENUMERATE_SHELL_BUILTIN(exit) \ __ENUMERATE_SHELL_BUILTIN(exit) \
__ENUMERATE_SHELL_BUILTIN(export) \ __ENUMERATE_SHELL_BUILTIN(export) \
__ENUMERATE_SHELL_BUILTIN(glob) \ __ENUMERATE_SHELL_BUILTIN(glob) \
__ENUMERATE_SHELL_BUILTIN(unalias) \ __ENUMERATE_SHELL_BUILTIN(unalias) \
__ENUMERATE_SHELL_BUILTIN(unset) \ __ENUMERATE_SHELL_BUILTIN(unset) \
__ENUMERATE_SHELL_BUILTIN(history) \ __ENUMERATE_SHELL_BUILTIN(history) \
__ENUMERATE_SHELL_BUILTIN(umask) \ __ENUMERATE_SHELL_BUILTIN(umask) \
__ENUMERATE_SHELL_BUILTIN(not ) \ __ENUMERATE_SHELL_BUILTIN(not ) \
__ENUMERATE_SHELL_BUILTIN(dirs) \ __ENUMERATE_SHELL_BUILTIN(dirs) \
__ENUMERATE_SHELL_BUILTIN(pushd) \ __ENUMERATE_SHELL_BUILTIN(pushd) \
__ENUMERATE_SHELL_BUILTIN(popd) \ __ENUMERATE_SHELL_BUILTIN(popd) \
__ENUMERATE_SHELL_BUILTIN(setopt) \ __ENUMERATE_SHELL_BUILTIN(setopt) \
__ENUMERATE_SHELL_BUILTIN(shift) \ __ENUMERATE_SHELL_BUILTIN(shift) \
__ENUMERATE_SHELL_BUILTIN(source) \ __ENUMERATE_SHELL_BUILTIN(source) \
__ENUMERATE_SHELL_BUILTIN(time) \ __ENUMERATE_SHELL_BUILTIN(time) \
__ENUMERATE_SHELL_BUILTIN(jobs) \ __ENUMERATE_SHELL_BUILTIN(jobs) \
__ENUMERATE_SHELL_BUILTIN(disown) \ __ENUMERATE_SHELL_BUILTIN(disown) \
__ENUMERATE_SHELL_BUILTIN(fg) \ __ENUMERATE_SHELL_BUILTIN(fg) \
__ENUMERATE_SHELL_BUILTIN(bg) \ __ENUMERATE_SHELL_BUILTIN(bg) \
__ENUMERATE_SHELL_BUILTIN(wait) \ __ENUMERATE_SHELL_BUILTIN(wait) \
__ENUMERATE_SHELL_BUILTIN(dump) \ __ENUMERATE_SHELL_BUILTIN(dump) \
__ENUMERATE_SHELL_BUILTIN(kill) \ __ENUMERATE_SHELL_BUILTIN(kill) \
__ENUMERATE_SHELL_BUILTIN(noop) \ __ENUMERATE_SHELL_BUILTIN(noop) \
__ENUMERATE_SHELL_BUILTIN(break) \
__ENUMERATE_SHELL_BUILTIN(continue) \
__ENUMERATE_SHELL_BUILTIN(argsparser_parse) __ENUMERATE_SHELL_BUILTIN(argsparser_parse)
#define ENUMERATE_SHELL_OPTIONS() \ #define ENUMERATE_SHELL_OPTIONS() \