aboutsummaryrefslogtreecommitdiff
path: root/src/eval/eval_tree_cd.cc
diff options
context:
space:
mode:
author_ov4 <ov4@ov4.org>2026-10-04 18:09:43 +0000
committer_ov4 <ov4@ov4.org>2026-10-04 18:09:43 +0000
commitfda4936771831605db13a3f7b5d85bb49db3998c (patch)
treeacca70a7848e9b0c5311d6fbab696ef152881ebb /src/eval/eval_tree_cd.cc
parent98f08f3a9511fba9d818bae3eb23ba03b525d749 (diff)
refactor eval
Diffstat (limited to 'src/eval/eval_tree_cd.cc')
-rw-r--r--src/eval/eval_tree_cd.cc56
1 files changed, 56 insertions, 0 deletions
diff --git a/src/eval/eval_tree_cd.cc b/src/eval/eval_tree_cd.cc
new file mode 100644
index 0000000..7d7c1af
--- /dev/null
+++ b/src/eval/eval_tree_cd.cc
@@ -0,0 +1,56 @@
+#include "eval.h"
+
+#include <string>
+
+#include "error.h"
+#include "lang_analysis/lexer_class.h"
+#include "lang_analysis/ast.h"
+#include "lang_analysis/token.h"
+#include "lang_analysis/enum_type.h"
+#include "lang_analysis/symbol_property.h"
+#include "util/io.h"
+
+using namespace std;
+
+namespace ov4
+{
+
+int eval_tree_cd(size_t i, const T_lexer &lexer_instance, bool inside_subshell)
+{
+ // TODO: async
+
+ int ret = -1;
+
+ println("eval_tree_cd: processing {} subshell {}", i, (lexer_instance.ast[i].subshell ? "TRUE" : "FALSE"));
+
+ // if it's a subshell, and current AST's subshell status is not subshell
+ // (subshell should be forkerd already, then set inside_subshell = true)
+ // fork itself
+ if (lexer_instance.ast[i].subshell && !inside_subshell)
+ {
+ eval_exe("", false, &lexer_instance, i);
+ return 0;
+ }
+
+ if (lexer_instance.ast[i].token_type == TEXT)
+ {
+ ret = eval_exe(lexer_instance.ast[i].command_text, false);
+ return ret;
+ }
+
+ if (lexer_instance.ast[i].left != string::npos)
+ {
+ ret = eval_tree_cd(lexer_instance.ast[i].left, lexer_instance, false);
+ }
+
+ if (lexer_instance.ast[i].right != string::npos)
+ {
+ if (lexer_instance.ast[i].token_type == LOGIC_AND && ret != 0) return ret;
+ if (lexer_instance.ast[i].token_type == LOGIC_OR && ret == 0) return ret;
+
+ ret = eval_tree_cd(lexer_instance.ast[i].right, lexer_instance, false);
+ }
+ return ret;
+}
+
+} \ No newline at end of file