From: Jeremy Kerr Date: Wed, 11 Sep 2013 02:47:37 +0000 (+0800) Subject: discover/grub2: Add structures & API for parser X-Git-Tag: v1.0.0~476 X-Git-Url: http://git.ozlabs.org/?p=petitboot;a=commitdiff_plain;h=1284a547ec73795d7d76dc099426fb89c3359f25 discover/grub2: Add structures & API for parser Signed-off-by: Jeremy Kerr --- diff --git a/discover/grub2/grub2.h b/discover/grub2/grub2.h index f2a780d..2c7951a 100644 --- a/discover/grub2/grub2.h +++ b/discover/grub2/grub2.h @@ -1,10 +1,85 @@ #ifndef GRUB2_H #define GRUB2_H +#include +#include + +struct grub2_parser; + +struct grub2_word { + const char *text; + bool expand; + bool split; + struct grub2_word *next; + struct list_item argv_list; +}; + +struct grub2_argv { + struct list words; +}; + +struct grub2_statement_simple { + struct grub2_argv *argv; +}; + +struct grub2_statement_menuentry { + struct grub2_argv *argv; + struct grub2_statements *statements; +}; + +struct grub2_statement_if { + struct grub2_statement *condition; + struct grub2_statements *true_case; + struct grub2_statements *false_case; +}; + +struct grub2_statement { + struct list_item list; + enum { + STMT_TYPE_SIMPLE, + STMT_TYPE_MENUENTRY, + STMT_TYPE_IF, + } type; + union { + struct grub2_statement_simple simple; + struct grub2_statement_menuentry menuentry; + struct grub2_statement_if ifstmt; + }; +}; + +struct grub2_statements { + struct list list; +}; + struct grub2_parser { - void *scanner; + void *scanner; + struct grub2_statements *statements; }; +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 *create_statement_menuentry(struct grub2_parser *parser, + struct grub2_argv *argv, struct grub2_statements *stmts); + +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_word *create_word(struct grub2_parser *parser, const char *text, + bool expand, bool split); + +struct grub2_argv *create_argv(struct grub2_parser *parser); + +void statement_append(struct grub2_statements *stmts, + struct grub2_statement *stmt); + +void argv_append(struct grub2_argv *argv, struct grub2_word *word); + +void word_append(struct grub2_word *w1, struct grub2_word *w2); #endif /* GRUB2_H */ diff --git a/discover/grub2/parser-api.c b/discover/grub2/parser-api.c new file mode 100644 index 0000000..6e05ecf --- /dev/null +++ b/discover/grub2/parser-api.c @@ -0,0 +1,79 @@ + +#include + +#include "grub2.h" + +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 *stmt = talloc(parser, struct grub2_statement); + stmt->type = STMT_TYPE_SIMPLE; + stmt->simple.argv = argv; + return stmt; +} + +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 *create_statement_if(struct grub2_parser *parser, + struct grub2_statement *condition, + 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; +} +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(struct grub2_parser *parser, const char *text, + bool expand, bool split) +{ + struct grub2_word *word = talloc(parser, struct grub2_word); + word->text = talloc_strdup(word, text); + word->expand = expand; + word->split = split; + word->next = NULL; + 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->next = w2; +} diff --git a/discover/grub2/parser.y b/discover/grub2/parser.y index dbdde51..45ad4e1 100644 --- a/discover/grub2/parser.y +++ b/discover/grub2/parser.y @@ -14,11 +14,7 @@ static void yyerror(struct grub2_parser *, char const *s); %} %union { - struct { - char *strval; - int expand; - int split; - }; + struct grub2_word *word; } /* reserved words */