]> git.ipfire.org Git - thirdparty/nftables.git/commitdiff
parser: add a helper for concat expression handling
authorFlorian Westphal <fw@strlen.de>
Wed, 11 Dec 2019 13:31:44 +0000 (14:31 +0100)
committerFlorian Westphal <fw@strlen.de>
Mon, 16 Dec 2019 16:02:19 +0000 (17:02 +0100)
Cull the repeated copy&paste snippets and add/use a helper for this.

Signed-off-by: Florian Westphal <fw@strlen.de>
src/parser_bison.y

index 707f46716ed3ff5b03f7132788d8b96e6a82a7cd..0fd9b94c5b2f783122d102bc89f27dc8cba90bfd 100644 (file)
@@ -102,6 +102,25 @@ static void location_update(struct location *loc, struct location *rhs, int n)
        }
 }
 
+static struct expr *handle_concat_expr(const struct location *loc,
+                                        struct expr *expr,
+                                        struct expr *expr_l, struct expr *expr_r,
+                                        struct location loc_rhs[3])
+{
+       if (expr->etype != EXPR_CONCAT) {
+               expr = concat_expr_alloc(loc);
+               compound_expr_add(expr, expr_l);
+       } else {
+               location_update(&expr_r->location, loc_rhs, 2);
+
+               expr = expr_l;
+               expr->location = *loc;
+       }
+
+       compound_expr_add(expr, expr_r);
+       return expr;
+}
+
 #define YYLLOC_DEFAULT(Current, Rhs, N)        location_update(&Current, Rhs, N)
 
 #define symbol_value(loc, str) \
@@ -1878,20 +1897,12 @@ data_type_atom_expr     :       type_identifier
 data_type_expr         :       data_type_atom_expr
                        |       data_type_expr  DOT     data_type_atom_expr
                        {
-                               if ($1->etype != EXPR_CONCAT) {
-                                       $$ = concat_expr_alloc(&@$);
-                                       compound_expr_add($$, $1);
-                               } else {
-                                       struct location rhs[] = {
-                                               [1]     = @2,
-                                               [2]     = @3,
-                                       };
-                                       location_update(&$3->location, rhs, 2);
-
-                                       $$ = $1;
-                                       $$->location = @$;
-                               }
-                               compound_expr_add($$, $3);
+                               struct location rhs[] = {
+                                       [1]     = @2,
+                                       [2]     = @3,
+                               };
+
+                               $$ = handle_concat_expr(&@$, $$, $1, $3, rhs);
                        }
                        ;
 
@@ -2992,20 +3003,12 @@ basic_stmt_expr         :       inclusive_or_stmt_expr
 concat_stmt_expr       :       basic_stmt_expr
                        |       concat_stmt_expr        DOT     primary_stmt_expr
                        {
-                               if ($$->etype != EXPR_CONCAT) {
-                                       $$ = concat_expr_alloc(&@$);
-                                       compound_expr_add($$, $1);
-                               } else {
-                                       struct location rhs[] = {
-                                               [1]     = @2,
-                                               [2]     = @3,
-                                       };
-                                       location_update(&$3->location, rhs, 2);
-
-                                       $$ = $1;
-                                       $$->location = @$;
-                               }
-                               compound_expr_add($$, $3);
+                               struct location rhs[] = {
+                                       [1]     = @2,
+                                       [2]     = @3,
+                               };
+
+                               $$ = handle_concat_expr(&@$, $$, $1, $3, rhs);
                        }
                        ;
 
@@ -3525,20 +3528,12 @@ basic_expr              :       inclusive_or_expr
 concat_expr            :       basic_expr
                        |       concat_expr             DOT             basic_expr
                        {
-                               if ($$->etype != EXPR_CONCAT) {
-                                       $$ = concat_expr_alloc(&@$);
-                                       compound_expr_add($$, $1);
-                               } else {
-                                       struct location rhs[] = {
-                                               [1]     = @2,
-                                               [2]     = @3,
-                                       };
-                                       location_update(&$3->location, rhs, 2);
-
-                                       $$ = $1;
-                                       $$->location = @$;
-                               }
-                               compound_expr_add($$, $3);
+                               struct location rhs[] = {
+                                       [1]     = @2,
+                                       [2]     = @3,
+                               };
+
+                               $$ = handle_concat_expr(&@$, $$, $1, $3, rhs);
                        }
                        ;
 
@@ -3946,20 +3941,12 @@ basic_rhs_expr          :       inclusive_or_rhs_expr
 concat_rhs_expr                :       basic_rhs_expr
                        |       concat_rhs_expr DOT     basic_rhs_expr
                        {
-                               if ($$->etype != EXPR_CONCAT) {
-                                       $$ = concat_expr_alloc(&@$);
-                                       compound_expr_add($$, $1);
-                               } else {
-                                       struct location rhs[] = {
-                                               [1]     = @2,
-                                               [2]     = @3,
-                                       };
-                                       location_update(&$3->location, rhs, 2);
-
-                                       $$ = $1;
-                                       $$->location = @$;
-                               }
-                               compound_expr_add($$, $3);
+                               struct location rhs[] = {
+                                       [1]     = @2,
+                                       [2]     = @3,
+                               };
+
+                               $$ = handle_concat_expr(&@$, $$, $1, $3, rhs);
                        }
                        ;