summaryrefslogtreecommitdiffstats
path: root/discover/parser.c
diff options
context:
space:
mode:
Diffstat (limited to 'discover/parser.c')
-rw-r--r--discover/parser.c36
1 files changed, 26 insertions, 10 deletions
diff --git a/discover/parser.c b/discover/parser.c
index 5b1a7ab..87241a9 100644
--- a/discover/parser.c
+++ b/discover/parser.c
@@ -6,25 +6,41 @@
#include "device-handler.h"
#include "log.h"
#include "parser.h"
-extern struct parser kboot_parser;
+#include "parser-utils.h"
-/* array of parsers, ordered by priority */
-static struct parser *parsers[] = {
- &kboot_parser,
- NULL
-};
+extern struct parser __start_parsers[], __stop_parsers[];
void iterate_parsers(struct discover_context *ctx)
{
- int i;
+ struct parser *parser;
pb_log("trying parsers for %s\n", ctx->device_path);
- for (i = 0; parsers[i]; i++) {
- pb_log("\ttrying parser '%s'\n", parsers[i]->name);
+ for (parser = __start_parsers; parser < __stop_parsers; parser++) {
+ pb_log("\ttrying parser '%s'\n", parser->name);
/* just use a dummy device path for now */
- if (parsers[i]->parse(ctx))
+ if (parser->parse(ctx))
return;
}
pb_log("\tno boot_options found\n");
}
+
+static int compare_parsers(const void *a, const void *b)
+{
+ const struct parser *parser_a = a, *parser_b = b;
+
+ if (parser_a->priority > parser_b->priority)
+ return -1;
+
+ if (parser_a->priority < parser_b->priority)
+ return 1;
+
+ return 0;
+}
+
+void parser_init(void)
+{
+ /* sort our parsers into descending priority order */
+ qsort(__start_parsers, __stop_parsers - __start_parsers,
+ sizeof(struct parser), compare_parsers);
+}
OpenPOWER on IntegriCloud