X-Git-Url: http://git.ozlabs.org/?a=blobdiff_plain;f=discover%2Fgrub2%2Fparser.y;h=9d79d9b9b136aeeed1abf010ffe81db568f24586;hb=20889c61bc0e6712c1cac5a0a6e9e8e9dff7cf84;hp=0beddd6fc3e28252af96acb74cd12a34a0186ebd;hpb=4d411d31deff5c4b2ad7d1689a9219c649843875;p=petitboot diff --git a/discover/grub2/parser.y b/discover/grub2/parser.y index 0beddd6..9d79d9b 100644 --- a/discover/grub2/parser.y +++ b/discover/grub2/parser.y @@ -130,6 +130,12 @@ statement: /* we just flatten everything */ $$ = create_statement_block(parser, $6); } + | "for" TOKEN_DELIM word TOKEN_DELIM "in" TOKEN_DELIM words TOKEN_EOL + "do" sep + statements + "done" { + $$ = create_statement_for(parser, $3, $7, $11); + } words: word { $$ = create_argv(parser); @@ -243,6 +249,19 @@ struct grub2_statement *create_statement_function(struct grub2_parser *parser, return &stmt->st; } +struct grub2_statement *create_statement_for(struct grub2_parser *parser, + struct grub2_word *var, struct grub2_argv *list, + struct grub2_statements *body) +{ + struct grub2_statement_for *stmt = + talloc(parser, struct grub2_statement_for); + stmt->st.exec = statement_for_execute; + stmt->var = var; + stmt->list = list; + stmt->body = body; + return &stmt->st; +} + void statement_append(struct grub2_statements *stmts, struct grub2_statement *stmt) { @@ -310,6 +329,9 @@ void grub2_parser_parse(struct grub2_parser *parser, const char *filename, YY_BUFFER_STATE bufstate; int rc; + if (!len) + return; + parser->script->filename = filename; bufstate = yy_scan_bytes(buf, len - 1, parser->scanner);