From a099258ab5796be02602f39d88c41f89ff34209f Mon Sep 17 00:00:00 2001 From: Pablo Neira Ayuso Date: Mon, 18 Apr 2016 12:36:46 +0200 Subject: segtree: explicit initialization via set_to_intervals() Allow explicit compound expression to initialize the set intervals. Incremental updates to interval sets require this. Signed-off-by: Pablo Neira Ayuso --- src/segtree.c | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) (limited to 'src/segtree.c') diff --git a/src/segtree.c b/src/segtree.c index d8f98faa..c0a8c289 100644 --- a/src/segtree.c +++ b/src/segtree.c @@ -64,11 +64,12 @@ struct elementary_interval { struct expr *expr; }; -static void seg_tree_init(struct seg_tree *tree, const struct set *set) +static void seg_tree_init(struct seg_tree *tree, const struct set *set, + struct expr *init) { struct expr *first; - first = list_entry(set->init->expressions.next, struct expr, list); + first = list_entry(init->expressions.next, struct expr, list); tree->root = RB_ROOT; tree->keytype = set->keytype; tree->keylen = set->keylen; @@ -431,14 +432,14 @@ static void set_insert_interval(struct expr *set, struct seg_tree *tree, compound_expr_add(set, expr); } -int set_to_intervals(struct list_head *errs, struct set *set) +int set_to_intervals(struct list_head *errs, struct set *set, struct expr *init) { struct elementary_interval *ei, *next; struct seg_tree tree; LIST_HEAD(list); - seg_tree_init(&tree, set); - if (set_to_segtree(errs, set->init, &tree) < 0) + seg_tree_init(&tree, set, init); + if (set_to_segtree(errs, init, &tree) < 0) return -1; segtree_linearize(&list, &tree); @@ -448,12 +449,12 @@ int set_to_intervals(struct list_head *errs, struct set *set) 2 * tree.keylen / BITS_PER_BYTE, ei->left, 2 * tree.keylen / BITS_PER_BYTE, ei->right); } - set_insert_interval(set->init, &tree, ei); + set_insert_interval(init, &tree, ei); ei_destroy(ei); } if (segtree_debug()) { - expr_print(set->init); + expr_print(init); pr_gmp_debug("\n"); } return 0; -- cgit v1.2.3