summaryrefslogtreecommitdiffstats
path: root/src/expr.c
diff options
context:
space:
mode:
authorTavian Barnes <tavianator@tavianator.com>2023-07-21 10:11:20 -0400
committerTavian Barnes <tavianator@tavianator.com>2023-12-20 20:19:18 -0500
commit8f004e73238c5ee4be40c044827138eb5895ce88 (patch)
treec93e247d9adc7074033f9e88c8071981092ea8b1 /src/expr.c
parentcbbcb340c974fca7312713d2515e3b32bacb176f (diff)
downloadbfs-8f004e73238c5ee4be40c044827138eb5895ce88.tar.xz
expr: Move some implementation into expr.c
Diffstat (limited to 'src/expr.c')
-rw-r--r--src/expr.c56
1 files changed, 56 insertions, 0 deletions
diff --git a/src/expr.c b/src/expr.c
new file mode 100644
index 0000000..380038c
--- /dev/null
+++ b/src/expr.c
@@ -0,0 +1,56 @@
+// Copyright © Tavian Barnes <tavianator@tavianator.com>
+// SPDX-License-Identifier: 0BSD
+
+#include "expr.h"
+#include "alloc.h"
+#include "eval.h"
+#include "exec.h"
+#include "printf.h"
+#include "xregex.h"
+#include <stdio.h>
+#include <stdlib.h>
+
+struct bfs_expr *bfs_expr_new(bfs_eval_fn *eval_fn, size_t argc, char **argv) {
+ struct bfs_expr *expr = ZALLOC(struct bfs_expr);
+ if (!expr) {
+ perror("zalloc()");
+ return NULL;
+ }
+
+ expr->eval_fn = eval_fn;
+ expr->argc = argc;
+ expr->argv = argv;
+ expr->probability = 0.5;
+ return expr;
+}
+
+bool bfs_expr_is_parent(const struct bfs_expr *expr) {
+ return expr->eval_fn == eval_and
+ || expr->eval_fn == eval_or
+ || expr->eval_fn == eval_not
+ || expr->eval_fn == eval_comma;
+}
+
+bool bfs_expr_never_returns(const struct bfs_expr *expr) {
+ // Expressions that never return are vacuously both always true and always false
+ return expr->always_true && expr->always_false;
+}
+
+void bfs_expr_free(struct bfs_expr *expr) {
+ if (!expr) {
+ return;
+ }
+
+ if (bfs_expr_is_parent(expr)) {
+ bfs_expr_free(expr->rhs);
+ bfs_expr_free(expr->lhs);
+ } else if (expr->eval_fn == eval_exec) {
+ bfs_exec_free(expr->exec);
+ } else if (expr->eval_fn == eval_fprintf) {
+ bfs_printf_free(expr->printf);
+ } else if (expr->eval_fn == eval_regex) {
+ bfs_regfree(expr->regex);
+ }
+
+ free(expr);
+}