]> git.ozlabs.org Git - petitboot/blob - discover/grub2/grub2.h
discover/grub2: Use subclass-style structs for AST
[petitboot] / discover / grub2 / grub2.h
1 #ifndef GRUB2_H
2 #define GRUB2_H
3
4 #include <stdbool.h>
5 #include <list/list.h>
6
7 struct grub2_parser;
8
9 struct grub2_word {
10         const char              *text;
11         bool                    expand;
12         bool                    split;
13         struct grub2_word       *next;
14         struct list_item        argv_list;
15 };
16
17 struct grub2_argv {
18         struct list             words;
19 };
20
21 struct grub2_statements {
22         struct list             list;
23 };
24
25 struct grub2_statement {
26         struct list_item        list;
27         enum {
28                 STMT_TYPE_SIMPLE,
29                 STMT_TYPE_MENUENTRY,
30                 STMT_TYPE_IF,
31                 STMT_TYPE_BLOCK,
32         } type;
33 };
34
35 struct grub2_statement_simple {
36         struct grub2_statement  st;
37         struct grub2_argv       *argv;
38 };
39
40 struct grub2_statement_menuentry {
41         struct grub2_statement  st;
42         struct grub2_argv       *argv;
43         struct grub2_statements *statements;
44 };
45
46 struct grub2_statement_if {
47         struct grub2_statement  st;
48         struct grub2_statement  *condition;
49         struct grub2_statements *true_case;
50         struct grub2_statements *false_case;
51 };
52
53 struct grub2_statement_block {
54         struct grub2_statement  st;
55         struct grub2_statements *statements;
56 };
57
58 struct grub2_parser {
59         void                    *scanner;
60         struct grub2_statements *statements;
61 };
62
63 struct grub2_statements *create_statements(struct grub2_parser *parser);
64
65 struct grub2_statement *create_statement_simple(struct grub2_parser *parser,
66                 struct grub2_argv *argv);
67
68 struct grub2_statement *create_statement_menuentry(struct grub2_parser *parser,
69                 struct grub2_argv *argv, struct grub2_statements *stmts);
70
71 struct grub2_statement *create_statement_if(struct grub2_parser *parser,
72                 struct grub2_statement *condition,
73                 struct grub2_statements *true_case,
74                 struct grub2_statements *false_case);
75
76 struct grub2_statement *create_statement_block(struct grub2_parser *parser,
77                 struct grub2_statements *stmts);
78
79 struct grub2_word *create_word(struct grub2_parser *parser, const char *text,
80                 bool expand, bool split);
81
82 struct grub2_argv *create_argv(struct grub2_parser *parser);
83
84 void statement_append(struct grub2_statements *stmts,
85                 struct grub2_statement *stmt);
86
87 void argv_append(struct grub2_argv *argv, struct grub2_word *word);
88
89 void word_append(struct grub2_word *w1, struct grub2_word *w2);
90
91 #endif /* GRUB2_H */
92