diff options
author | Patrick McHardy <kaber@trash.net> | 2014-09-24 13:49:04 +0200 |
---|---|---|
committer | Patrick McHardy <kaber@trash.net> | 2014-09-24 13:49:04 +0200 |
commit | d68824c96f2e8cee14b6a505c91fd379b9aa3088 (patch) | |
tree | ee3ea46ca708c99d93149a17860d857b7123a53b /src/expression.c | |
parent | 01b27b6d961d548c25f0fc185fd05fc3d2380080 (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.c | 38 |
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); + } +} |