blob: a5651e13efeb1285d345427f2538034054a0fbe1 [file] [log] [blame]
Klaus Heinrich Kiwid1cd8c52020-02-27 12:43:47 -03001From 706ca57516d2fc92a404a1ca44b2984f17f5eeb3 Mon Sep 17 00:00:00 2001
2From: Jeremy Kerr <jk@ozlabs.org>
3Date: Thu, 14 Nov 2019 13:17:16 +0800
4Subject: [PATCH 13/18] discover/grub2: expose internal parse function
5
6Upcoming changes will need a method to parse a secondary file (to
7support the 'source' command), but not execute it as a new script.
8
9This change exposes the parsing code, separate from the execution code.
10
11Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
12(cherry picked from commit 2c132ebc93a44b7550b1fdb3f5f7b010e51f47e8)
13Signed-off-by: Klaus Heinrich Kiwi <klaus@linux.vnet.ibm.com>
14---
15 discover/grub2/grub2-parser.y | 17 +++++++++++++++--
16 discover/grub2/grub2.c | 2 +-
17 discover/grub2/grub2.h | 8 ++++++--
18 3 files changed, 22 insertions(+), 5 deletions(-)
19
20diff --git a/discover/grub2/grub2-parser.y b/discover/grub2/grub2-parser.y
21index 527a61c..f99bbfd 100644
22--- a/discover/grub2/grub2-parser.y
23+++ b/discover/grub2/grub2-parser.y
24@@ -331,14 +331,15 @@ struct grub2_parser *grub2_parser_create(struct discover_context *ctx)
25 return parser;
26 }
27
28-void grub2_parser_parse(struct grub2_parser *parser, const char *filename,
29+/* performs a parse on buf, setting parser->script->statements */
30+int grub2_parser_parse(struct grub2_parser *parser, const char *filename,
31 char *buf, int len)
32 {
33 YY_BUFFER_STATE bufstate;
34 int rc;
35
36 if (!len)
37- return;
38+ return -1;
39
40 parser->script->filename = filename;
41
42@@ -349,6 +350,18 @@ void grub2_parser_parse(struct grub2_parser *parser, const char *filename,
43
44 yy_delete_buffer(bufstate, parser->scanner);
45
46+ parser->inter_word = false;
47+
48+ return rc;
49+}
50+
51+void grub2_parser_parse_and_execute(struct grub2_parser *parser,
52+ const char *filename, char *buf, int len)
53+{
54+ int rc;
55+
56+ rc = grub2_parser_parse(parser, filename, buf, len);
57+
58 if (!rc)
59 script_execute(parser->script);
60 }
61diff --git a/discover/grub2/grub2.c b/discover/grub2/grub2.c
62index a8d115f..b176ce2 100644
63--- a/discover/grub2/grub2.c
64+++ b/discover/grub2/grub2.c
65@@ -169,7 +169,7 @@ static int grub2_parse(struct discover_context *dc)
66 continue;
67
68 parser = grub2_parser_create(dc);
69- grub2_parser_parse(parser, *filename, buf, len);
70+ grub2_parser_parse_and_execute(parser, *filename, buf, len);
71 device_handler_status_dev_info(dc->handler, dc->device,
72 _("Parsed GRUB configuration from %s"),
73 *filename);
74diff --git a/discover/grub2/grub2.h b/discover/grub2/grub2.h
75index 323b461..668d070 100644
76--- a/discover/grub2/grub2.h
77+++ b/discover/grub2/grub2.h
78@@ -204,9 +204,13 @@ struct grub2_file *grub2_parse_file(struct grub2_script *script,
79 struct discover_device *grub2_lookup_device(struct device_handler *handler,
80 const char *desc);
81
82+/* internal parse api */
83+int grub2_parser_parse(struct grub2_parser *parser, const char *filename,
84+ char *buf, int len);
85+
86 /* external parser api */
87 struct grub2_parser *grub2_parser_create(struct discover_context *ctx);
88-void grub2_parser_parse(struct grub2_parser *parser, const char *filename,
89- char *buf, int len);
90+void grub2_parser_parse_and_execute(struct grub2_parser *parser,
91+ const char *filename, char *buf, int len);
92 #endif /* GRUB2_H */
93
94--
952.17.1
96