]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
libsmartcols: (filter) implement logical operators
authorKarel Zak <kzak@redhat.com>
Tue, 5 Sep 2023 08:57:42 +0000 (10:57 +0200)
committerKarel Zak <kzak@redhat.com>
Mon, 20 Nov 2023 21:25:46 +0000 (22:25 +0100)
Signed-off-by: Karel Zak <kzak@redhat.com>
libsmartcols/src/filter-expr.c
libsmartcols/src/filter-param.c
libsmartcols/src/filter.c
libsmartcols/src/smartcolsP.h

index e34365d1657a973e5b0b14bb2e6799e3acdcfd4f..59e5df7888649b8dda6829ff64f5fdf90a26d03d 100644 (file)
@@ -85,3 +85,33 @@ void filter_dump_expr(struct ul_jsonwrt *json, struct filter_expr *n)
 
        ul_jsonwrt_object_close(json);
 }
+
+int filter_eval_expr(struct libscols_filter *fltr, struct filter_expr *n,
+                    struct libscols_line *ln, int *status)
+{
+       int rc = 0;
+       enum filter_etype oper = n->type;
+
+       /* logical operators */
+       switch (oper) {
+       case F_EXPR_AND:
+               rc = filter_eval_node(fltr, n->left, ln, status);
+               if (rc == 0 && *status)
+                       rc = filter_eval_node(fltr, n->right, ln, status);
+               return rc;
+       case F_EXPR_OR:
+               rc = filter_eval_node(fltr, n->left, ln, status);
+               if (rc == 0 && !*status)
+                       rc = filter_eval_node(fltr, n->right, ln, status);
+               return rc;
+       case F_EXPR_NEG:
+               rc = filter_eval_node(fltr, n->right, ln, status);
+               if (rc == 0)
+                       *status = !*status;
+               return rc;
+       default:
+               break;
+       }
+
+       return rc;
+}
index f67efa509a0e3e9add5775270b6519f9bb9ee1b8..a5ef6abc27b234b6a140b8d4c0f9954abb94b970 100644 (file)
@@ -108,7 +108,6 @@ int filter_eval_param(struct libscols_filter *fltr  __attribute__((__unused__)),
                break;
        }
 
-       DBG(FLTR, ul_debugobj(fltr, "eval param [rc=%d, status=%d]", rc, *status));
        return rc;
 }
 
index 4a1e56b28a8fc8592a7fbc6f2b6873abf300433a..3bb2e3d3e7adc9eb4395aaa507e17f3a0b857b73 100644 (file)
@@ -195,10 +195,8 @@ int filter_eval_node(struct libscols_filter *fltr, struct filter_node *n,
        switch (n->type) {
        case F_NODE_PARAM:
                return filter_eval_param(fltr, (struct filter_param *) n, ln, status);
-       /* TODO
        case F_NODE_EXPR:
                return filter_eval_expr(fltr, (struct filter_expr *) n, ln, status);
-       */
        default:
                break;
        }
index 0407b089a09714580ef1b996e9f12d6bd7ec92d3..93fc6c633f2de9e58ade6b1ba2a8b9a7b6e5446f 100644 (file)
@@ -574,7 +574,8 @@ int filter_next_param(struct libscols_filter *fltr,
 /* expr */
 void filter_free_expr(struct filter_expr *n);
 void filter_dump_expr(struct ul_jsonwrt *json, struct filter_expr *n);
-
+int filter_eval_expr(struct libscols_filter *fltr, struct filter_expr *n,
+                       struct libscols_line *ln, int *status);
 
 /* required by parser */
 struct filter_node *filter_new_param(struct libscols_filter *filter,