Add helper function to check if this is a catchall expression. Signed-off-by: Pablo Neira Ayuso --- include/expression.h | 3 +++ src/evaluate.c | 2 +- src/intervals.c | 12 ++++++------ src/segtree.c | 2 +- 4 files changed, 11 insertions(+), 8 deletions(-) diff --git a/include/expression.h b/include/expression.h index e483b7e76f4c..2e0754edaaae 100644 --- a/include/expression.h +++ b/include/expression.h @@ -552,6 +552,9 @@ extern struct expr *set_elem_expr_alloc(const struct location *loc, struct expr *set_elem_catchall_expr_alloc(const struct location *loc); +#define expr_type_catchall(__expr) \ + ((__expr)->etype == EXPR_SET_ELEM_CATCHALL) + extern void range_expr_value_low(mpz_t rop, const struct expr *expr); extern void range_expr_value_high(mpz_t rop, const struct expr *expr); void range_expr_swap_values(struct expr *range); diff --git a/src/evaluate.c b/src/evaluate.c index 8f037601c45f..abbe3bf7e9e5 100644 --- a/src/evaluate.c +++ b/src/evaluate.c @@ -1928,7 +1928,7 @@ static bool elem_key_compatible(const struct expr *set_key, const struct expr *elem_key) { /* Catchall element is always compatible with the set key declaration */ - if (elem_key->etype == EXPR_SET_ELEM_CATCHALL) + if (expr_type_catchall(elem_key)) return true; return datatype_compatible(set_key->dtype, elem_key->dtype); diff --git a/src/intervals.c b/src/intervals.c index 8c8ce8c8a305..d5afffd2120a 100644 --- a/src/intervals.c +++ b/src/intervals.c @@ -175,7 +175,7 @@ static void setelem_automerge(struct set_automerge_ctx *ctx) mpz_init(rop); list_for_each_entry_safe(i, next, &expr_set(ctx->init)->expressions, list) { - if (i->key->etype == EXPR_SET_ELEM_CATCHALL) + if (expr_type_catchall(i->key)) continue; range_expr_value_low(range.low, i); @@ -410,7 +410,7 @@ static int setelem_delete(struct list_head *msgs, struct set *set, list_for_each_entry_safe(elem, next, &expr_set(elems)->expressions, list) { i = interval_expr_key(elem); - if (i->key->etype == EXPR_SET_ELEM_CATCHALL) { + if (expr_type_catchall(i->key)) { /* Assume max value to simplify handling. */ mpz_bitmask(range.low, i->len); mpz_bitmask(range.high, i->len); @@ -574,7 +574,7 @@ static int setelem_overlap(struct list_head *msgs, struct set *set, list_for_each_entry_safe(elem, next, &expr_set(init)->expressions, list) { i = interval_expr_key(elem); - if (i->key->etype == EXPR_SET_ELEM_CATCHALL) + if (expr_type_catchall(i->key)) continue; range_expr_value_low(range.low, i); @@ -686,7 +686,7 @@ int set_to_intervals(const struct set *set, struct expr *init, bool add) list_for_each_entry_safe(i, n, &expr_set(init)->expressions, list) { elem = interval_expr_key(i); - if (elem->key->etype == EXPR_SET_ELEM_CATCHALL) + if (expr_type_catchall(elem->key)) continue; if (prev) @@ -770,12 +770,12 @@ int setelem_to_interval(const struct set *set, struct expr *elem, bool adjacent = false; key = setelem_key(elem); - if (key->etype == EXPR_SET_ELEM_CATCHALL) + if (expr_type_catchall(key)) return 0; if (next_elem) { next_key = setelem_key(next_elem); - if (next_key->etype == EXPR_SET_ELEM_CATCHALL) + if (expr_type_catchall(next_key)) next_key = NULL; } diff --git a/src/segtree.c b/src/segtree.c index fd77e03fbff5..607f002f181e 100644 --- a/src/segtree.c +++ b/src/segtree.c @@ -579,7 +579,7 @@ void interval_map_decompose(struct expr *set) else if (i->etype == EXPR_MAPPING) key = i->left->key; - if (key && key->etype == EXPR_SET_ELEM_CATCHALL) { + if (key && expr_type_catchall(key)) { list_del(&i->list); catchall = i; continue; -- 2.30.2