return expr;
}
+struct expr *expr_clone(const struct expr *expr)
+{
+ struct expr *new;
+
+ new = expr_alloc(&expr->location, expr->ops, expr->dtype,
+ expr->byteorder, expr->len);
+ new->flags = expr->flags;
+ new->op = expr->op;
+ expr->ops->clone(new, expr);
+ return new;
+}
+
struct expr *expr_get(struct expr *expr)
{
expr->refcnt++;
datatype_print(expr);
}
+static void verdict_expr_clone(struct expr *new, const struct expr *expr)
+{
+ new->verdict = expr->verdict;
+ if (expr->chain != NULL)
+ new->chain = xstrdup(expr->chain);
+}
+
static void verdict_expr_destroy(struct expr *expr)
{
xfree(expr->chain);
.type = EXPR_VERDICT,
.name = "verdict",
.print = verdict_expr_print,
+ .clone = verdict_expr_clone,
.destroy = verdict_expr_destroy,
};
printf("%s%s", expr->scope != NULL ? "$" : "", expr->identifier);
}
+static void symbol_expr_clone(struct expr *new, const struct expr *expr)
+{
+ new->sym_type = expr->sym_type;
+ new->scope = expr->scope;
+ new->identifier = xstrdup(expr->identifier);
+}
+
static void symbol_expr_destroy(struct expr *expr)
{
xfree(expr->identifier);
.type = EXPR_SYMBOL,
.name = "symbol",
.print = symbol_expr_print,
+ .clone = symbol_expr_clone,
.destroy = symbol_expr_destroy,
};
datatype_print(expr);
}
+static void constant_expr_clone(struct expr *new, const struct expr *expr)
+{
+ mpz_init_set(new->value, expr->value);
+}
+
static void constant_expr_destroy(struct expr *expr)
{
mpz_clear(expr->value);
.type = EXPR_VALUE,
.name = "value",
.print = constant_expr_print,
+ .clone = constant_expr_clone,
.destroy = constant_expr_destroy,
};
expr_set_type(expr->expr, type, byteorder);
}
+static void prefix_expr_clone(struct expr *new, const struct expr *expr)
+{
+ new->expr = expr_clone(expr->expr);
+ new->prefix_len = expr->prefix_len;
+}
+
+static void prefix_expr_destroy(struct expr *expr)
+{
+ expr_free(expr->expr);
+}
+
static const struct expr_ops prefix_expr_ops = {
.type = EXPR_PREFIX,
.name = "prefix",
.print = prefix_expr_print,
.set_type = prefix_expr_set_type,
+ .clone = prefix_expr_clone,
+ .destroy = prefix_expr_destroy,
};
struct expr *prefix_expr_alloc(const struct location *loc,
printf(")");
}
+static void unary_expr_clone(struct expr *new, const struct expr *expr)
+{
+ new->arg = expr_clone(expr->expr);
+}
+
static void unary_expr_destroy(struct expr *expr)
{
expr_free(expr->arg);
.type = EXPR_UNARY,
.name = "unary",
.print = unary_expr_print,
+ .clone = unary_expr_clone,
.destroy = unary_expr_destroy,
};
expr_print(expr->right);
}
+static void binop_expr_clone(struct expr *new, const struct expr *expr)
+{
+ new->left = expr_clone(expr->left);
+ new->right = expr_clone(expr->right);
+}
+
static void binop_expr_destroy(struct expr *expr)
{
expr_free(expr->left);
.type = EXPR_BINOP,
.name = "binop",
.print = binop_expr_print,
+ .clone = binop_expr_clone,
.destroy = binop_expr_destroy,
};
expr_print(expr->right);
}
+static void range_expr_clone(struct expr *new, const struct expr *expr)
+{
+ new->left = expr_clone(expr->left);
+ new->right = expr_clone(expr->right);
+}
+
static void range_expr_destroy(struct expr *expr)
{
expr_free(expr->left);
.type = EXPR_RANGE,
.name = "range",
.print = range_expr_print,
+ .clone = range_expr_clone,
.destroy = range_expr_destroy,
.set_type = range_expr_set_type,
};
return expr;
}
+static void compound_expr_clone(struct expr *new, const struct expr *expr)
+{
+ struct expr *i;
+
+ init_list_head(&new->expressions);
+ list_for_each_entry(i, &expr->expressions, list)
+ compound_expr_add(new, expr_clone(i));
+}
+
static void compound_expr_destroy(struct expr *expr)
{
struct expr *i, *next;
.type = EXPR_CONCAT,
.name = "concat",
.print = concat_expr_print,
+ .clone = compound_expr_clone,
.destroy = compound_expr_destroy,
};
.type = EXPR_LIST,
.name = "list",
.print = list_expr_print,
+ .clone = compound_expr_clone,
.destroy = compound_expr_destroy,
};
.name = "set",
.print = set_expr_print,
.set_type = set_expr_set_type,
+ .clone = compound_expr_clone,
.destroy = compound_expr_destroy,
};
expr_set_type(expr->left, dtype, byteorder);
}
+static void mapping_expr_clone(struct expr *new, const struct expr *expr)
+{
+ new->left = expr_clone(expr->left);
+ new->right = expr_clone(expr->right);
+}
+
static void mapping_expr_destroy(struct expr *expr)
{
expr_free(expr->left);
.name = "mapping",
.print = mapping_expr_print,
.set_type = mapping_expr_set_type,
+ .clone = mapping_expr_clone,
.destroy = mapping_expr_destroy,
};
expr_print(expr->mappings);
}
+static void map_expr_clone(struct expr *new, const struct expr *expr)
+{
+ new->expr = expr_clone(expr->expr);
+ new->mappings = expr_clone(expr->mappings);
+}
+
static void map_expr_destroy(struct expr *expr)
{
expr_free(expr->expr);
.type = EXPR_MAP,
.name = "map",
.print = map_expr_print,
+ .clone = map_expr_clone,
.destroy = map_expr_destroy,
};