]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
libsmartcols: (filter) evaluate params
authorKarel Zak <kzak@redhat.com>
Tue, 5 Sep 2023 08:54:53 +0000 (10:54 +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/samples/filter.c
libsmartcols/src/filter-param.c
libsmartcols/src/filter.c
libsmartcols/src/libsmartcols.h.in
libsmartcols/src/libsmartcols.sym
libsmartcols/src/smartcolsP.h

index aaf7fb69eaf72da5afb6c0b46260448d6f68043c..fe8121c8e1fc4f0768e2c8541b57d052e6bec3ed 100644 (file)
@@ -155,8 +155,18 @@ int main(int argc, char *argv[])
                        goto done;
        }
 
-       for (i = 0; i < 10; i++)
-               add_line(tb, i + 1);
+       for (i = 0; i < 10; i++) {
+               struct libscols_line *ln = add_line(tb, i + 1);
+               int rc, status = 0;
+
+               if (!fltr)
+                       continue;
+               rc = scols_line_apply_filter(ln, fltr, &status);
+               if (rc)
+                       goto done;
+               if (status == 0) /* false */
+                       scols_table_remove_line(tb, ln);
+       }
 
        scols_print_table(tb);
 done:
index cec98691de806c70275bf806f58aad971e51f28f..f67efa509a0e3e9add5775270b6519f9bb9ee1b8 100644 (file)
@@ -81,6 +81,37 @@ void filter_dump_param(struct ul_jsonwrt *json, struct filter_param *n)
        ul_jsonwrt_object_close(json);
 }
 
+int filter_eval_param(struct libscols_filter *fltr  __attribute__((__unused__)),
+               struct filter_param *n,
+               struct libscols_line *ln  __attribute__((__unused__)),
+               int *status)
+{
+       int rc = 0;
+
+       switch (n->type) {
+       case F_PARAM_NAME: /* TODO */
+               break;
+       case F_PARAM_STRING:
+               *status = n->val.str != NULL && *n->val.str != '\0';
+               break;
+       case F_PARAM_NUMBER:
+               *status = n->val.num != 0;
+               break;
+       case F_PARAM_FLOAT:
+               *status = n->val.fnum != 0.0;
+               break;
+       case F_PARAM_BOOLEAN:
+               *status = n->val.boolean != false;
+               break;
+       default:
+               rc = -EINVAL;
+               break;
+       }
+
+       DBG(FLTR, ul_debugobj(fltr, "eval param [rc=%d, status=%d]", rc, *status));
+       return rc;
+}
+
 int filter_next_param(struct libscols_filter *fltr,
                      struct libscols_iter *itr, struct filter_param **prm)
 {
index e960ba66d21ccb7454d958569f171e38370ff454..4a1e56b28a8fc8592a7fbc6f2b6873abf300433a 100644 (file)
@@ -188,3 +188,28 @@ int scols_filter_assign_column(struct libscols_filter *fltr,
 
        return ct == 0 ? 1 : 0;
 }
+
+int filter_eval_node(struct libscols_filter *fltr, struct filter_node *n,
+                       struct libscols_line *ln, int *status)
+{
+       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;
+       }
+       return -EINVAL;
+}
+
+int scols_line_apply_filter(struct libscols_line *ln,
+                       struct libscols_filter *fltr, int *status)
+{
+       if (!ln || !fltr || !fltr->root)
+               return -EINVAL;
+
+       return filter_eval_node(fltr, fltr->root, ln, status);
+}
index bb23e1f08b5d0f3e00d278ef79e712cc79149723..ae1f58145082243ca28e24beb1361dd5e855a9cc 100644 (file)
@@ -374,6 +374,9 @@ extern void scols_unref_filter(struct libscols_filter *fltr);
 extern int scols_dump_filter(struct libscols_filter *fltr, FILE *out);
 extern const char *scols_filter_get_errmsg(struct libscols_filter *fltr);
 
+extern int scols_line_apply_filter(struct libscols_line *ln,
+                       struct libscols_filter *fltr, int *status);
+
 extern int scols_filter_next_name(struct libscols_filter *fltr,
                         struct libscols_iter *itr, const char **name);
 extern int scols_filter_assign_column(struct libscols_filter *fltr,
index b50c80d79b17fdc46759bcb5a76df62b41362e5d..5e0c56069663c57ae21711b291b8c1f9361498dd 100644 (file)
@@ -228,4 +228,5 @@ SMARTCOLS_2.40 {
        scols_filter_get_errmsg;
        scols_filter_next_name;
        scols_filter_assign_column;
+       scols_line_apply_filter;
 } SMARTCOLS_2.39;
index 0119cedfd58313eae38d7abfb406e708379bd2d7..0407b089a09714580ef1b996e9f12d6bd7ec92d3 100644 (file)
@@ -559,9 +559,13 @@ void filter_ref_node(struct filter_node *n);
 void filter_unref_node(struct filter_node *n);
 
 void filter_dump_node(struct ul_jsonwrt *json, struct filter_node *n);
+int filter_eval_node(struct libscols_filter *fltr, struct filter_node *n,
+                       struct libscols_line *ln, int *status);
 
 /* param */
 void filter_dump_param(struct ul_jsonwrt *json, struct filter_param *n);
+int filter_eval_param(struct libscols_filter *fltr, struct filter_param *n,
+                       struct libscols_line *ln, int *status);
 void filter_free_param(struct filter_param *n);
 
 int filter_next_param(struct libscols_filter *fltr,