[ovs-dev] [PATCH 07/14] actions: Factor parsing a single action into a new function parse_action().

Justin Pettit jpettit at ovn.org
Fri Dec 11 01:16:02 UTC 2015


Acked-by: Justin Pettit <jpettit at ovn.org>

--Justin


> On Dec 8, 2015, at 5:08 PM, Ben Pfaff <blp at ovn.org> wrote:
> 
> This will have another user in an upcoming commit.
> 
> Signed-off-by: Ben Pfaff <blp at ovn.org>
> ---
> ovn/lib/actions.c | 70 +++++++++++++++++++++++++++++++------------------------
> 1 file changed, 39 insertions(+), 31 deletions(-)
> 
> diff --git a/ovn/lib/actions.c b/ovn/lib/actions.c
> index 581dbae..6bc452a 100644
> --- a/ovn/lib/actions.c
> +++ b/ovn/lib/actions.c
> @@ -52,6 +52,8 @@ struct action_context {
>     struct expr *prereqs;       /* Prerequisites to apply to match. */
> };
> 
> +static bool parse_action(struct action_context *);
> +
> static bool
> action_error_handle_common(struct action_context *ctx)
> {
> @@ -225,6 +227,42 @@ emit_ct(struct action_context *ctx, bool recirc_next, bool commit)
>     add_prerequisite(ctx, "ip");
> }
> 
> +static bool
> +parse_action(struct action_context *ctx)
> +{
> +    if (ctx->lexer->token.type != LEX_T_ID) {
> +        action_syntax_error(ctx, NULL);
> +        return false;
> +    }
> +
> +    enum lex_type lookahead = lexer_lookahead(ctx->lexer);
> +    if (lookahead == LEX_T_EQUALS || lookahead == LEX_T_EXCHANGE
> +        || lookahead == LEX_T_LSQUARE) {
> +        parse_set_action(ctx);
> +    } else if (lexer_match_id(ctx->lexer, "next")) {
> +        parse_next_action(ctx);
> +    } else if (lexer_match_id(ctx->lexer, "output")) {
> +        emit_resubmit(ctx, ctx->output_ptable);
> +    } else if (lexer_match_id(ctx->lexer, "ip.ttl")) {
> +        if (lexer_match(ctx->lexer, LEX_T_DECREMENT)) {
> +            add_prerequisite(ctx, "ip");
> +            ofpact_put_DEC_TTL(ctx->ofpacts);
> +        } else {
> +            action_syntax_error(ctx, "expecting `--'");
> +        }
> +    } else if (lexer_match_id(ctx->lexer, "ct_next")) {
> +        emit_ct(ctx, true, false);
> +    } else if (lexer_match_id(ctx->lexer, "ct_commit")) {
> +        emit_ct(ctx, false, true);
> +    } else {
> +        action_syntax_error(ctx, "expecting action");
> +    }
> +    if (!lexer_match(ctx->lexer, LEX_T_SEMICOLON)) {
> +        action_syntax_error(ctx, "expecting ';'");
> +    }
> +    return !ctx->error;
> +}
> +
> static void
> parse_actions(struct action_context *ctx)
> {
> @@ -242,37 +280,7 @@ parse_actions(struct action_context *ctx)
>     }
> 
>     while (ctx->lexer->token.type != LEX_T_END) {
> -        if (ctx->lexer->token.type != LEX_T_ID) {
> -            action_syntax_error(ctx, NULL);
> -            break;
> -        }
> -
> -        enum lex_type lookahead = lexer_lookahead(ctx->lexer);
> -        if (lookahead == LEX_T_EQUALS || lookahead == LEX_T_EXCHANGE
> -            || lookahead == LEX_T_LSQUARE) {
> -            parse_set_action(ctx);
> -        } else if (lexer_match_id(ctx->lexer, "next")) {
> -            parse_next_action(ctx);
> -        } else if (lexer_match_id(ctx->lexer, "output")) {
> -            emit_resubmit(ctx, ctx->output_ptable);
> -        } else if (lexer_match_id(ctx->lexer, "ip.ttl")) {
> -            if (lexer_match(ctx->lexer, LEX_T_DECREMENT)) {
> -                add_prerequisite(ctx, "ip");
> -                ofpact_put_DEC_TTL(ctx->ofpacts);
> -            } else {
> -                action_syntax_error(ctx, "expecting `--'");
> -            }
> -        } else if (lexer_match_id(ctx->lexer, "ct_next")) {
> -            emit_ct(ctx, true, false);
> -        } else if (lexer_match_id(ctx->lexer, "ct_commit")) {
> -            emit_ct(ctx, false, true);
> -        } else {
> -            action_syntax_error(ctx, "expecting action");
> -        }
> -        if (!lexer_match(ctx->lexer, LEX_T_SEMICOLON)) {
> -            action_syntax_error(ctx, "expecting ';'");
> -        }
> -        if (ctx->error) {
> +        if (!parse_action(ctx)) {
>             return;
>         }
>     }
> -- 
> 2.1.3
> 
> _______________________________________________
> dev mailing list
> dev at openvswitch.org
> http://openvswitch.org/mailman/listinfo/dev




More information about the dev mailing list