mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-06-11 10:18:15 +09:00
Shell: Add the 'break' and 'continue' POSIX builtins
These only support n=1 for now.
This commit is contained in:
parent
0318ac5ce4
commit
79c76d67ce
Notes:
sideshowbarker
2024-07-16 20:40:13 +09:00
Author: https://github.com/alimpfard
Commit: 79c76d67ce
Pull-request: https://github.com/SerenityOS/serenity/pull/18429
Reviewed-by: https://github.com/nico ✅
2 changed files with 83 additions and 31 deletions
|
@ -215,6 +215,56 @@ ErrorOr<int> Shell::builtin_unalias(Main::Arguments arguments)
|
|||
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)
|
||||
{
|
||||
int job_id = -1;
|
||||
|
|
|
@ -23,37 +23,39 @@
|
|||
#include <LibMain/Main.h>
|
||||
#include <termios.h>
|
||||
|
||||
#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() \
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue