]>
git.ipfire.org Git - thirdparty/util-linux.git/blob - libsmartcols/src/filter-expr.c
6 #include "smartcolsP.h"
8 struct filter_node
*filter_new_expr(
9 struct libscols_filter
*fltr
__attribute__((__unused__
)),
10 enum filter_etype type
,
11 struct filter_node
*left
,
12 struct filter_node
*right
)
14 struct filter_expr
*n
= (struct filter_expr
*) __filter_new_node(
15 F_NODE_EXPR
, sizeof(struct filter_expr
));
37 return (struct filter_node
*) n
;
40 void filter_free_expr(struct filter_expr
*n
)
42 filter_unref_node(n
->left
);
43 filter_unref_node(n
->right
);
47 static const char *expr_type_as_string(struct filter_expr
*n
)
76 void filter_dump_expr(struct ul_jsonwrt
*json
, struct filter_expr
*n
)
78 ul_jsonwrt_object_open(json
, "expr");
79 ul_jsonwrt_value_s(json
, "type", expr_type_as_string(n
));
82 filter_dump_node(json
, n
->left
);
84 filter_dump_node(json
, n
->right
);
86 ul_jsonwrt_object_close(json
);
90 int filter_eval_expr(struct libscols_filter
*fltr
, struct filter_expr
*n
,
91 struct libscols_line
*ln
, int *status
)
94 enum filter_etype oper
= n
->type
;
96 /* logical operators */
99 rc
= filter_eval_node(fltr
, n
->left
, ln
, status
);
100 if (rc
== 0 && *status
)
101 rc
= filter_eval_node(fltr
, n
->right
, ln
, status
);
104 rc
= filter_eval_node(fltr
, n
->left
, ln
, status
);
105 if (rc
== 0 && !*status
)
106 rc
= filter_eval_node(fltr
, n
->right
, ln
, status
);
109 rc
= filter_eval_node(fltr
, n
->right
, ln
, status
);