summaryrefslogtreecommitdiffstats
path: root/discover
diff options
context:
space:
mode:
authorJeremy Kerr <jk@ozlabs.org>2013-09-11 10:47:37 +0800
committerJeremy Kerr <jk@ozlabs.org>2013-09-24 13:14:59 +0800
commit1284a547ec73795d7d76dc099426fb89c3359f25 (patch)
tree6fe7ceaf2a502f3bc5b72b4dbf66d12a4a68afd8 /discover
parent2013dd8075a57e5399f080fa8094cc4b464f35cd (diff)
downloadtalos-petitboot-1284a547ec73795d7d76dc099426fb89c3359f25.tar.gz
talos-petitboot-1284a547ec73795d7d76dc099426fb89c3359f25.zip
discover/grub2: Add structures & API for parser
Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
Diffstat (limited to 'discover')
-rw-r--r--discover/grub2/grub2.h77
-rw-r--r--discover/grub2/parser-api.c79
-rw-r--r--discover/grub2/parser.y6
3 files changed, 156 insertions, 6 deletions
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 <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
index 0000000..6e05ecf
--- /dev/null
+++ b/discover/grub2/parser-api.c
@@ -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;
+}
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 */
OpenPOWER on IntegriCloud