summaryrefslogtreecommitdiff
path: root/filter
diff options
context:
space:
mode:
Diffstat (limited to 'filter')
-rw-r--r--filter/data.c6
-rw-r--r--filter/data.h5
-rw-r--r--filter/tree.c8
3 files changed, 16 insertions, 3 deletions
diff --git a/filter/data.c b/filter/data.c
index 87c438fc..56d746fd 100644
--- a/filter/data.c
+++ b/filter/data.c
@@ -336,7 +336,7 @@ clist_set_type(const struct f_tree *set, struct f_val *v)
}
}
-static int
+int
clist_match_set(const struct adata *clist, const struct f_tree *set)
{
if (!clist)
@@ -357,7 +357,7 @@ clist_match_set(const struct adata *clist, const struct f_tree *set)
return 0;
}
-static int
+int
eclist_match_set(const struct adata *list, const struct f_tree *set)
{
if (!list)
@@ -381,7 +381,7 @@ eclist_match_set(const struct adata *list, const struct f_tree *set)
return 0;
}
-static int
+int
lclist_match_set(const struct adata *list, const struct f_tree *set)
{
if (!list)
diff --git a/filter/data.h b/filter/data.h
index c96856ce..051f0932 100644
--- a/filter/data.h
+++ b/filter/data.h
@@ -192,6 +192,7 @@ struct f_tree *f_new_tree(void);
struct f_tree *build_tree(struct f_tree *);
const struct f_tree *find_tree(const struct f_tree *t, const struct f_val *val);
int same_tree(const struct f_tree *t0, const struct f_tree *t2);
+int tree_node_count(const struct f_tree *t);
void tree_format(const struct f_tree *t, buffer *buf);
void tree_walk(const struct f_tree *t, void (*hook)(const struct f_tree *, void *), void *data);
@@ -286,6 +287,10 @@ static inline int lclist_set_type(const struct f_tree *set)
static inline int path_set_type(const struct f_tree *set)
{ return !set || set->from.type == T_INT; }
+int clist_match_set(const struct adata *clist, const struct f_tree *set);
+int eclist_match_set(const struct adata *list, const struct f_tree *set);
+int lclist_match_set(const struct adata *list, const struct f_tree *set);
+
const struct adata *clist_filter(struct linpool *pool, const struct adata *list, const struct f_val *set, int pos);
const struct adata *eclist_filter(struct linpool *pool, const struct adata *list, const struct f_val *set, int pos);
const struct adata *lclist_filter(struct linpool *pool, const struct adata *list, const struct f_val *set, int pos);
diff --git a/filter/tree.c b/filter/tree.c
index 5da86b9d..97bf7dae 100644
--- a/filter/tree.c
+++ b/filter/tree.c
@@ -134,6 +134,14 @@ same_tree(const struct f_tree *t1, const struct f_tree *t2)
return 1;
}
+int
+tree_node_count(const struct f_tree *t)
+{
+ if (t == NULL)
+ return 0;
+
+ return 1 + tree_node_count(t->left) + tree_node_count(t->right);
+}
static void
tree_node_format(const struct f_tree *t, buffer *buf)