X-Git-Url: https://git.ozlabs.org/?a=blobdiff_plain;f=discover%2Fgrub2%2Fparser-api.c;h=f8915a1f52b3065b725f215918a1c5d4da669d17;hb=c12f6bacbd96fda27252bdb79781e5743c01da60;hp=6e05ecf56faaa9261ee5c292aa35e97bbf7155e0;hpb=1284a547ec73795d7d76dc099426fb89c3359f25;p=petitboot diff --git a/discover/grub2/parser-api.c b/discover/grub2/parser-api.c index 6e05ecf..f8915a1 100644 --- a/discover/grub2/parser-api.c +++ b/discover/grub2/parser-api.c @@ -14,20 +14,24 @@ struct grub2_statements *create_statements(struct grub2_parser *parser) struct grub2_statement *create_statement_simple(struct grub2_parser *parser, struct grub2_argv *argv) { - struct grub2_statement *stmt = talloc(parser, struct grub2_statement); - stmt->type = STMT_TYPE_SIMPLE; - stmt->simple.argv = argv; - return stmt; + struct grub2_statement_simple *stmt = + talloc(parser, struct grub2_statement_simple); + stmt->st.type = STMT_TYPE_SIMPLE; + stmt->st.exec = statement_simple_execute; + stmt->argv = argv; + return &stmt->st; } struct grub2_statement *create_statement_menuentry(struct grub2_parser *parser, struct grub2_argv *argv, struct grub2_statements *stmts) { - struct grub2_statement *stmt = talloc(parser, struct grub2_statement); - stmt->type = STMT_TYPE_MENUENTRY; - stmt->menuentry.argv = argv; - stmt->menuentry.statements = stmts; - return stmt; + struct grub2_statement_menuentry *stmt = + talloc(parser, struct grub2_statement_menuentry); + stmt->st.type = STMT_TYPE_MENUENTRY; + stmt->st.exec = NULL; + stmt->argv = argv; + stmt->statements = stmts; + return &stmt->st; } struct grub2_statement *create_statement_if(struct grub2_parser *parser, @@ -35,13 +39,27 @@ struct grub2_statement *create_statement_if(struct grub2_parser *parser, struct grub2_statements *true_case, struct grub2_statements *false_case) { - struct grub2_statement *stmt = talloc(parser, struct grub2_statement); - stmt->type = STMT_TYPE_IF; - stmt->ifstmt.condition = condition; - stmt->ifstmt.true_case = true_case; - stmt->ifstmt.false_case = false_case; - return stmt; + 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; + return &stmt->st; } + +struct grub2_statement *create_statement_block(struct grub2_parser *parser, + struct grub2_statements *stmts) +{ + struct grub2_statement_block *stmt = + talloc(parser, struct grub2_statement_block); + stmt->st.type = STMT_TYPE_BLOCK; + stmt->st.exec = NULL; + stmt->statements = stmts; + return &stmt->st; +} + void statement_append(struct grub2_statements *stmts, struct grub2_statement *stmt) { @@ -50,14 +68,26 @@ void statement_append(struct grub2_statements *stmts, list_add_tail(&stmts->list, &stmt->list); } -struct grub2_word *create_word(struct grub2_parser *parser, const char *text, - bool expand, bool split) +struct grub2_word *create_word_text(struct grub2_parser *parser, + const char *text) { struct grub2_word *word = talloc(parser, struct grub2_word); + word->type = GRUB2_WORD_TEXT; word->text = talloc_strdup(word, text); - word->expand = expand; - word->split = split; word->next = NULL; + word->last = word; + return word; +} + +struct grub2_word *create_word_var(struct grub2_parser *parser, + const char *name, bool split) +{ + struct grub2_word *word = talloc(parser, struct grub2_word); + word->type = GRUB2_WORD_VAR; + word->var.name = talloc_strdup(word, name); + word->var.split = split; + word->next = NULL; + word->last = word; return word; } @@ -75,5 +105,6 @@ void argv_append(struct grub2_argv *argv, struct grub2_word *word) void word_append(struct grub2_word *w1, struct grub2_word *w2) { - w1->next = w2; + w1->last->next = w2; + w1->last = w2; }