diff options
author | Jeremy Kerr <jk@ozlabs.org> | 2013-09-17 13:02:05 +0800 |
---|---|---|
committer | Jeremy Kerr <jk@ozlabs.org> | 2013-09-24 13:14:59 +0800 |
commit | 9638c29114c8d575d1b89c26dcf1f274ea6ab6c4 (patch) | |
tree | d39b3d16444474f7018a1948d59c7e479f3fd5ee /discover/grub2/parser.y | |
parent | 63575c2045b1505da7a2abca8a51a4a7aa3df6f7 (diff) | |
download | talos-petitboot-9638c29114c8d575d1b89c26dcf1f274ea6ab6c4.tar.gz talos-petitboot-9638c29114c8d575d1b89c26dcf1f274ea6ab6c4.zip |
discover/grub2: Create 'conditional' statements
Rather than holding the condition and conditional-statements in struct
grub2_statment_if, create a new conditional type that contains these. We
can then use this to implement elif statements.
Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
Diffstat (limited to 'discover/grub2/parser.y')
-rw-r--r-- | discover/grub2/parser.y | 41 |
1 files changed, 26 insertions, 15 deletions
diff --git a/discover/grub2/parser.y b/discover/grub2/parser.y index 0540ff3..52dac9c 100644 --- a/discover/grub2/parser.y +++ b/discover/grub2/parser.y @@ -47,6 +47,7 @@ static void yyerror(struct grub2_parser *, char const *s); %type <statement> statement %type <statements> statements +%type <statement> conditional %type <argv> words %type <word> word @@ -75,6 +76,10 @@ statements: /* empty */ { $$ = $1; } +conditional: statement TOKEN_EOL "then" TOKEN_EOL statements { + $$ = create_statement_conditional(parser, $1, $5); + } + statement: words { $$ = create_statement_simple(parser, $1); @@ -82,19 +87,14 @@ statement: | '{' statements '}' { $$ = create_statement_block(parser, $2); } - | "if" TOKEN_DELIM statement - "then" TOKEN_EOL - statements - "fi" { - $$ = create_statement_if(parser, $3, $6, NULL); + | "if" TOKEN_DELIM conditional "fi" { + $$ = create_statement_if(parser, $3, NULL); } - | "if" TOKEN_DELIM statement - "then" TOKEN_EOL - statements + | "if" TOKEN_DELIM conditional "else" TOKEN_EOL statements "fi" { - $$ = create_statement_if(parser, $3, $6, $9); + $$ = create_statement_if(parser, $3, $6); } | "function" TOKEN_DELIM word TOKEN_DELIM '{' statements '}' { $$ = create_statement_function(parser, $3, $6); @@ -163,18 +163,29 @@ struct grub2_statement *create_statement_menuentry(struct grub2_parser *parser, return &stmt->st; } -struct grub2_statement *create_statement_if(struct grub2_parser *parser, +struct grub2_statement *create_statement_conditional( + struct grub2_parser *parser, struct grub2_statement *condition, - struct grub2_statements *true_case, - struct grub2_statements *false_case) + struct grub2_statements *statements) +{ + struct grub2_statement_conditional *stmt = + talloc(parser, struct grub2_statement_conditional); + stmt->st.type = STMT_TYPE_CONDITIONAL; + stmt->condition = condition; + stmt->statements = statements; + return &stmt->st; +} + +struct grub2_statement *create_statement_if(struct grub2_parser *parser, + struct grub2_statement *conditional, + struct grub2_statements *else_case) { struct grub2_statement_if *stmt = talloc(parser, struct grub2_statement_if); stmt->st.type = STMT_TYPE_IF; stmt->st.exec = statement_if_execute; - stmt->condition = condition; - stmt->true_case = true_case; - stmt->false_case = false_case; + stmt->conditional = conditional; + stmt->else_case = else_case; return &stmt->st; } |