diff options
author | Pablo Neira Ayuso <pablo@netfilter.org> | 2023-02-02 18:15:22 +0100 |
---|---|---|
committer | Pablo Neira Ayuso <pablo@netfilter.org> | 2023-02-02 22:04:13 +0100 |
commit | 9dbbf397b2f3d9fa40454648cb98c13c7c5515b7 (patch) | |
tree | 1af7daeb01fa36e1f6e9766472bb9b9efc09f99a /src/optimize.c | |
parent | 4cc6b20d31498d90e90ff574ce8b70276afcee8f (diff) |
optimize: wrap code to build concatenation in helper function
Move code to build concatenations into helper function, this routine
includes support for expansion of implicit sets containing singleton
values. This is preparation work to reuse existing code in a follow up
patch.
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
Diffstat (limited to 'src/optimize.c')
-rw-r--r-- | src/optimize.c | 22 |
1 files changed, 15 insertions, 7 deletions
diff --git a/src/optimize.c b/src/optimize.c index 289c442d..8cec04c0 100644 --- a/src/optimize.c +++ b/src/optimize.c @@ -552,20 +552,19 @@ static void merge_stmts(const struct optimize_ctx *ctx, } } -static void __merge_concat_stmts(const struct optimize_ctx *ctx, uint32_t i, - const struct merge *merge, struct expr *set) +static void __merge_concat(const struct optimize_ctx *ctx, uint32_t i, + const struct merge *merge, struct list_head *concat_list) { - struct expr *concat, *next, *expr, *concat_clone, *clone, *elem; + struct expr *concat, *next, *expr, *concat_clone, *clone; LIST_HEAD(pending_list); - LIST_HEAD(concat_list); struct stmt *stmt_a; uint32_t k; concat = concat_expr_alloc(&internal_location); - list_add(&concat->list, &concat_list); + list_add(&concat->list, concat_list); for (k = 0; k < merge->num_stmts; k++) { - list_for_each_entry_safe(concat, next, &concat_list, list) { + list_for_each_entry_safe(concat, next, concat_list, list) { stmt_a = ctx->stmt_matrix[i][merge->stmt[k]]; switch (stmt_a->expr->right->etype) { case EXPR_SET: @@ -590,8 +589,17 @@ static void __merge_concat_stmts(const struct optimize_ctx *ctx, uint32_t i, break; } } - list_splice_init(&pending_list, &concat_list); + list_splice_init(&pending_list, concat_list); } +} + +static void __merge_concat_stmts(const struct optimize_ctx *ctx, uint32_t i, + const struct merge *merge, struct expr *set) +{ + struct expr *concat, *next, *elem; + LIST_HEAD(concat_list); + + __merge_concat(ctx, i, merge, &concat_list); list_for_each_entry_safe(concat, next, &concat_list, list) { list_del(&concat->list); |