summaryrefslogtreecommitdiffstats
path: root/src/expression.c
diff options
context:
space:
mode:
authorPatrick McHardy <kaber@trash.net>2014-09-24 13:49:04 +0200
committerPatrick McHardy <kaber@trash.net>2014-09-24 13:49:04 +0200
commitd68824c96f2e8cee14b6a505c91fd379b9aa3088 (patch)
treeee3ea46ca708c99d93149a17860d857b7123a53b /src/expression.c
parent01b27b6d961d548c25f0fc185fd05fc3d2380080 (diff)
expr: make range_low()/range_high() usable outside of segtree
Their functionality is also needed for set descriptions, move the functions to expressions.c and give them a more suitable name for global functions. Signed-off-by: Patrick McHardy <kaber@trash.net>
Diffstat (limited to 'src/expression.c')
-rw-r--r--src/expression.c38
1 files changed, 38 insertions, 0 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);
+ }
+}