From 45e92aa32a80fdbbf5ad3ad64e34b1ac872018ef Mon Sep 17 00:00:00 2001 From: Jeremy Kerr Date: Mon, 18 Mar 2013 14:23:23 +0800 Subject: parsers: dynamically register parsers Currently, we require all parsers to be defined in an array in parsers.c. This change removes this requirement, by introducting a register_parser() macro, which adds a constructor to register the parser with the core parser infrastructure. Because each parser no longer resolves an undefined symbol, we need to use a `ld -r` object for libparser, instead of using libtool, which creates a .a (and hence has no parsers included). Signed-off-by: Jeremy Kerr --- discover/parser.c | 23 ++++++++++------------- 1 file changed, 10 insertions(+), 13 deletions(-) (limited to 'discover/parser.c') diff --git a/discover/parser.c b/discover/parser.c index 0df8a73..641e06b 100644 --- a/discover/parser.c +++ b/discover/parser.c @@ -13,18 +13,8 @@ #include "parser-utils.h" #include "paths.h" -struct parser __grub2_parser; -struct parser __kboot_parser; -struct parser __native_parser; -struct parser __yaboot_parser; - -static struct parser *const parsers[] = { -// &__native_parser, - &__kboot_parser, - &__grub2_parser, - &__yaboot_parser, - NULL -}; +static int n_parsers; +static struct parser **parsers; static const int max_file_size = 1024 * 1024; @@ -114,7 +104,7 @@ void iterate_parsers(struct discover_context *ctx) pb_log("trying parsers for %s\n", ctx->device->device->id); - for (i = 0; parsers[i]; i++) { + for (i = 0; i < n_parsers; i++) { pb_log("\ttrying parser '%s'\n", parsers[i]->name); ctx->parser = parsers[i]; iterate_parser_files(ctx, parsers[i]); @@ -122,6 +112,13 @@ void iterate_parsers(struct discover_context *ctx) ctx->parser = NULL; } +void __register_parser(struct parser *parser) +{ + parsers = talloc_realloc(NULL, parsers, struct parser *, n_parsers + 1); + parsers[n_parsers] = parser; + n_parsers++; +} + void parser_init(void) { } -- cgit v1.2.1