summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/expression.c38
-rw-r--r--src/segtree.c42
2 files changed, 40 insertions, 40 deletions
diff --git a/src/expression.c b/src/expression.c
index fa14d99c..8ba2e8a1 100644
--- a/src/expression.c
+++ b/src/expression.c
@@ -879,3 +879,41 @@ struct expr *set_ref_expr_alloc(const struct location *loc, struct set *set)
expr->flags |= EXPR_F_CONSTANT;
return expr;
}
+
+void range_expr_value_low(mpz_t rop, const struct expr *expr)
+{
+ switch (expr->ops->type) {
+ case EXPR_VALUE:
+ return mpz_set(rop, expr->value);
+ case EXPR_PREFIX:
+ return range_expr_value_low(rop, expr->prefix);
+ case EXPR_RANGE:
+ return range_expr_value_low(rop, expr->left);
+ case EXPR_MAPPING:
+ return range_expr_value_low(rop, expr->left);
+ default:
+ BUG("invalid range expression type %s\n", expr->ops->name);
+ }
+}
+
+void range_expr_value_high(mpz_t rop, const struct expr *expr)
+{
+ mpz_t tmp;
+
+ switch (expr->ops->type) {
+ case EXPR_VALUE:
+ return mpz_set(rop, expr->value);
+ case EXPR_PREFIX:
+ range_expr_value_low(rop, expr->prefix);
+ mpz_init_bitmask(tmp, expr->len - expr->prefix_len);
+ mpz_add(rop, rop, tmp);
+ mpz_clear(tmp);
+ return;
+ case EXPR_RANGE:
+ return range_expr_value_high(rop, expr->right);
+ case EXPR_MAPPING:
+ return range_expr_value_high(rop, expr->left);
+ default:
+ BUG("invalid range expression type %s\n", expr->ops->name);
+ }
+}
diff --git a/src/segtree.c b/src/segtree.c
index 1785f640..753d8b84 100644
--- a/src/segtree.c
+++ b/src/segtree.c
@@ -256,44 +256,6 @@ static void ei_insert(struct seg_tree *tree, struct elementary_interval *new)
mpz_clear(p);
}
-static void range_low(mpz_t rop, struct expr *expr)
-{
- switch (expr->ops->type) {
- case EXPR_VALUE:
- return mpz_set(rop, expr->value);
- case EXPR_PREFIX:
- return range_low(rop, expr->prefix);
- case EXPR_RANGE:
- return range_low(rop, expr->left);
- case EXPR_MAPPING:
- return range_low(rop, expr->left);
- default:
- BUG("invalid range expression type %s\n", expr->ops->name);
- }
-}
-
-static void range_high(mpz_t rop, const struct expr *expr)
-{
- mpz_t tmp;
-
- switch (expr->ops->type) {
- case EXPR_VALUE:
- return mpz_set(rop, expr->value);
- case EXPR_PREFIX:
- range_low(rop, expr->prefix);
- mpz_init_bitmask(tmp, expr->len - expr->prefix_len);
- mpz_add(rop, rop, tmp);
- mpz_clear(tmp);
- return;
- case EXPR_RANGE:
- return range_high(rop, expr->right);
- case EXPR_MAPPING:
- return range_high(rop, expr->left);
- default:
- BUG("invalid range expression type %s\n", expr->ops->name);
- }
-}
-
/*
* Sort intervals according to their priority, which is defined inversely to
* their size.
@@ -353,8 +315,8 @@ static int set_to_segtree(struct list_head *msgs, struct expr *set,
*/
n = 0;
list_for_each_entry_safe(i, next, &set->expressions, list) {
- range_low(low, i);
- range_high(high, i);
+ range_expr_value_low(low, i);
+ range_expr_value_high(high, i);
ei = ei_alloc(low, high, i, 0);
intervals[n++] = ei;