From 44c098823fe3ebc40c276c7bb869430734221789 Mon Sep 17 00:00:00 2001 From: Peter Johnson Date: Wed, 30 Apr 2008 04:40:29 +0000 Subject: [PATCH] Allow registering of new modules at runtime. svn path=/trunk/yasm/; revision=2080 --- libyasm/module.h | 3 ++ libyasm/module.in | 115 ++++++++++++++++++++++++++++++++-------------- 2 files changed, 83 insertions(+), 35 deletions(-) diff --git a/libyasm/module.h b/libyasm/module.h index f930800f..b6b4f60b 100644 --- a/libyasm/module.h +++ b/libyasm/module.h @@ -69,4 +69,7 @@ void yasm_list_modules #define yasm_list_preproc(func) \ yasm_list_modules(YASM_MODULE_PREPROC, func) +void yasm_register_module(yasm_module_type type, const char *keyword, + void *data); + #endif diff --git a/libyasm/module.in b/libyasm/module.in index 2a3fd571..ff1e399b 100644 --- a/libyasm/module.in +++ b/libyasm/module.in @@ -73,14 +73,33 @@ static struct { {preproc_modules, sizeof(preproc_modules)/sizeof(module)}, }; +typedef struct loaded_module { + yasm_module_type type; /* module type */ + const char *keyword; /* module keyword */ + void *data; /* associated data */ +} loaded_module; + +static loaded_module *loaded_modules = NULL; +static size_t num_loaded_modules = 0; + void * yasm_load_module(yasm_module_type type, const char *keyword) { size_t i; - module *modules = module_types[type].m; - size_t n = module_types[type].n; + module *modules; + size_t n; - /* Look for the module/symbol. */ + /* Look for the module/symbol, first in loaded modules */ + if (loaded_modules) { + for (i=0; iname, arch->keyword); + break; + case YASM_MODULE_DBGFMT: + dbgfmt = data; + printfunc(dbgfmt->name, dbgfmt->keyword); + break; + case YASM_MODULE_OBJFMT: + objfmt = data; + printfunc(objfmt->name, objfmt->keyword); + break; + case YASM_MODULE_LISTFMT: + listfmt = data; + printfunc(listfmt->name, listfmt->keyword); + break; + case YASM_MODULE_PARSER: + parser = data; + printfunc(parser->name, parser->keyword); + break; + case YASM_MODULE_PREPROC: + preproc = data; + printfunc(preproc->name, preproc->keyword); + break; + } +} + +void +yasm_list_modules(yasm_module_type type, + void (*printfunc) (const char *name, const char *keyword)) +{ + size_t i; + module *modules; + size_t n;; + /* Go through available list, and try to load each one */ - for (i=0; iname, arch->keyword); - break; - case YASM_MODULE_DBGFMT: - dbgfmt = modules[i].data; - printfunc(dbgfmt->name, dbgfmt->keyword); - break; - case YASM_MODULE_OBJFMT: - objfmt = modules[i].data; - printfunc(objfmt->name, objfmt->keyword); - break; - case YASM_MODULE_LISTFMT: - listfmt = modules[i].data; - printfunc(listfmt->name, listfmt->keyword); - break; - case YASM_MODULE_PARSER: - parser = modules[i].data; - printfunc(parser->name, parser->keyword); - break; - case YASM_MODULE_PREPROC: - preproc = modules[i].data; - printfunc(preproc->name, preproc->keyword); - break; - } + if (loaded_modules) { + for (i=0; i