[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