瀏覽代碼

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

These only support n=1 for now.
Ali Mohammad Pur 2 年之前
父節點
當前提交
79c76d67ce
共有 2 個文件被更改,包括 83 次插入31 次删除
  1. 50 0
      Userland/Shell/Builtin.cpp
  2. 33 31
      Userland/Shell/Shell.h

+ 50 - 0
Userland/Shell/Builtin.cpp

@@ -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;

+ 33 - 31
Userland/Shell/Shell.h

@@ -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()                                                                                    \