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