X-Git-Url: http://git.ozlabs.org/?p=petitboot;a=blobdiff_plain;f=discover%2Fgrub2%2Fparser.y;h=0d02bc155aa6793134e25ee05bc607e68d68eaac;hp=eb61f556491c23c503caea2958fa29a408cd866a;hb=5c6263a12dd7f859daa0feba8b58a0558f0ff21c;hpb=e492b596187d283cfbd65a098fe1b2d0dafa311e;ds=sidebyside diff --git a/discover/grub2/parser.y b/discover/grub2/parser.y index eb61f55..0d02bc1 100644 --- a/discover/grub2/parser.y +++ b/discover/grub2/parser.y @@ -4,6 +4,8 @@ %parse-param { struct grub2_parser *parser } %{ +#include + #include "grub2.h" #include "parser.h" #include "lexer.h" @@ -111,3 +113,110 @@ void yyerror(struct grub2_parser *parser, char const *s) yyget_lineno(parser->scanner), s, yyget_text(parser->scanner)); } + +struct grub2_statements *create_statements(struct grub2_parser *parser) +{ + struct grub2_statements *stmts = talloc(parser, + struct grub2_statements); + list_init(&stmts->list); + return stmts; +} + +struct grub2_statement *create_statement_simple(struct grub2_parser *parser, + struct grub2_argv *argv) +{ + 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_menuentry *stmt = + talloc(parser, struct grub2_statement_menuentry); + stmt->st.type = STMT_TYPE_MENUENTRY; + stmt->st.exec = statement_menuentry_execute; + stmt->argv = argv; + stmt->statements = stmts; + return &stmt->st; +} + +struct grub2_statement *create_statement_if(struct grub2_parser *parser, + struct grub2_statement *condition, + struct grub2_statements *true_case, + struct grub2_statements *false_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; + 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) +{ + if (!stmt) + return; + list_add_tail(&stmts->list, &stmt->list); +} + +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->split = false; + word->text = talloc_strdup(word, text); + 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->name = talloc_strdup(word, name); + word->split = split; + word->next = NULL; + word->last = word; + return word; +} + +struct grub2_argv *create_argv(struct grub2_parser *parser) +{ + struct grub2_argv *argv = talloc(parser, struct grub2_argv); + list_init(&argv->words); + return argv; +} + +void argv_append(struct grub2_argv *argv, struct grub2_word *word) +{ + list_add_tail(&argv->words, &word->argv_list); +} + +void word_append(struct grub2_word *w1, struct grub2_word *w2) +{ + w1->last->next = w2; + w1->last = w2; +}