]> git.ozlabs.org Git - petitboot/commitdiff
discover/grub2: Add structures & API for parser
authorJeremy Kerr <jk@ozlabs.org>
Wed, 11 Sep 2013 02:47:37 +0000 (10:47 +0800)
committerJeremy Kerr <jk@ozlabs.org>
Tue, 24 Sep 2013 05:14:59 +0000 (13:14 +0800)
Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
discover/grub2/grub2.h
discover/grub2/parser-api.c [new file with mode: 0644]
discover/grub2/parser.y

index f2a780d385510317479085e4d29c092e82c28d20..2c7951a5520c90e4c5b5040f6da81fedc634cb6e 100644 (file)
@@ -1,10 +1,85 @@
 #ifndef GRUB2_H
 #define GRUB2_H
 
+#include <stdbool.h>
+#include <list/list.h>
+
+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 (file)
index 0000000..6e05ecf
--- /dev/null
@@ -0,0 +1,79 @@
+
+#include <talloc/talloc.h>
+
+#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;
+}
index dbdde51fe57fbc7377de1c7132f97d831aeee4e6..45ad4e13127d4414d77db15412c4fe190d45dc80 100644 (file)
@@ -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 */