+
+struct grub2_parser *grub2_parser_create(struct discover_context *ctx)
+{
+ struct grub2_parser *parser;
+
+ parser = talloc(ctx, struct grub2_parser);
+ yylex_init_extra(parser, &parser->scanner);
+ parser->script = create_script(parser, ctx);
+
+ return parser;
+}
+
+void grub2_parser_parse(struct grub2_parser *parser, const char *filename,
+ char *buf, int len)
+{
+ YY_BUFFER_STATE bufstate;
+ int rc;
+
+ if (!len)
+ return;
+
+ parser->script->filename = filename;
+
+ bufstate = yy_scan_bytes(buf, len - 1, parser->scanner);
+ yyset_lineno(1, parser->scanner);
+
+ rc = yyparse(parser, parser->scanner);
+
+ yy_delete_buffer(bufstate, parser->scanner);
+
+ if (!rc)
+ script_execute(parser->script);
+}
+