3 %lex-param { nscan_t scanner }
4 %parse-param { struct native_parser *parser }
5 %parse-param { void *scanner }
10 #include <talloc/talloc.h>
12 #include "discover/resource.h"
13 #include "discover/parser-utils.h"
17 void yyerror(struct native_parser *parser, void *scanner, const char *fmt, ...);
25 %token <word> TOKEN_WORD
26 %token <num> TOKEN_NUMBER
27 %token <num> TOKEN_DELIM
30 %token TOKEN_DEV_DESCRIPTION
37 %token TOKEN_DESCRIPTION
41 #include "native-lexer.h"
47 globals boot_options { native_parser_finish(parser); }
48 | boot_options { native_parser_finish(parser); }
51 globals: globals global
55 global: TOKEN_DEFAULT delims TOKEN_WORD {
56 if (parser->default_name)
57 pb_log_fn("Duplicate default option, ignoring\n");
59 parser->default_name = talloc_strdup(parser, $3);
61 | TOKEN_DEV_DESCRIPTION delims TOKEN_WORD {
62 native_append_string(parser,
63 &parser->ctx->device->device->description, $3);
75 name: TOKEN_NAME delims TOKEN_WORD {
76 native_parser_create_option(parser, $3);
84 param: TOKEN_IMAGE delims TOKEN_WORD {
85 native_set_resource(parser, &parser->opt->boot_image, $3);
87 | TOKEN_INITRD delims TOKEN_WORD {
88 native_set_resource(parser, &parser->opt->initrd, $3);
90 | TOKEN_DTB delims TOKEN_WORD {
91 native_set_resource(parser, &parser->opt->dtb, $3);
93 | TOKEN_ARGS delims TOKEN_WORD {
94 native_append_string(parser, &parser->opt->option->boot_args, $3);
96 | TOKEN_DESCRIPTION delims TOKEN_WORD {
97 native_append_string(parser, &parser->opt->option->description, $3);
101 delims: delims TOKEN_DELIM
107 void yyerror(struct native_parser *parser, void *scanner, const char *fmt, ...)
113 str = talloc_vasprintf(parser, fmt, ap);
116 pb_log("parse error: %d('%s'): %s\n", nget_lineno(scanner),
117 nget_text(scanner), str);
120 void native_parser_finish(struct native_parser *parser)
123 discover_context_add_boot_option(parser->ctx, parser->opt);
128 void native_set_resource(struct native_parser *parser,
129 struct resource ** resource, const char *path)
132 pb_log_fn("Duplicate resource at line %d: %s\n",
133 nget_lineno(parser->scanner), path);
137 *resource = create_devpath_resource(parser->opt, parser->opt->device,
141 void native_append_string(struct native_parser *parser,
142 char **str, const char *append)
145 *str = talloc_asprintf_append(*str, "%s", append);
147 *str = talloc_strdup(parser->opt, append);
150 void native_parser_create_option(struct native_parser *parser, const char *name)
152 struct discover_boot_option *opt = parser->opt;
155 native_parser_finish(parser);
157 opt = discover_boot_option_create(parser->ctx, parser->ctx->device);
158 opt->option->name = talloc_strdup(opt, name);
159 opt->option->id = talloc_asprintf(opt, "%s@%p",
160 parser->ctx->device->device->id, opt);
161 opt->option->type = DISCOVER_BOOT_OPTION;
162 opt->option->is_default = parser->default_name &&
163 streq(parser->default_name, name);
168 struct native_parser *native_parser_create(struct discover_context *ctx)
170 struct native_parser *parser;
172 parser = talloc_zero(ctx, struct native_parser);
174 nlex_init_extra(parser, &parser->scanner);
179 void native_parser_parse(struct native_parser *parser, const char *filename,
182 YY_BUFFER_STATE bufstate;
188 parser->filename = filename;
190 bufstate = n_scan_bytes(buf, len - 1, parser->scanner);
191 nset_lineno(1, parser->scanner);
193 rc = nparse(parser, parser->scanner);
196 pb_log("Failed to parse %s\n", filename);
198 n_delete_buffer(bufstate, parser->scanner);