#ifndef EL__MAIN_MODULE_H #define EL__MAIN_MODULE_H #include "config/options.h" #include "main/event.h" #ifdef __cplusplus extern "C" { #endif /* The module record */ struct module { /* The name of the module. It needs to be unique in its class (ie. in * the scope of root modules or submodules of one parent module). */ const char *name; /* The options that should be registered for this module. * The table should end with NULL_OPTION_INFO. */ union option_info *options; /* The event hooks that should be registered for this module. * The table should end with NULL_EVENT_HOOK_INFO. */ struct event_hook_info *hooks; /* Any submodules that this module contains. Order matters * since it is garanteed that initialization will happen in * the specified order and teardown in the reverse order. * The table should end with NULL. */ struct module **submodules; /* User data for the module. Undefined purpose. */ void *data; /* Lifecycle functions */ /* This function should initialize the module. */ void (*init)(struct module *module); /* This function should shutdown the module. */ void (*done)(struct module *module); /* This function return name and version of the module if set. */ const char *(*getname)(struct module *module); }; #define struct_module(name, options, hooks, submods, data, init, done, getname) \ { name, options, hooks, submods, data, init, done, getname } #define foreach_module(module, modules, i) \ for (i = 0, module = modules ? modules[i] : NULL; \ module; \ i++, module = modules[i]) /* The module table has to be NULL terminates */ static inline int sizeof_modules(struct module **modules) { struct module *module; int i; foreach_module (module, modules, i) { ; /* m33p */ } return i - 1; } #define foreachback_module(module, modules, i) \ for (i = sizeof_modules(modules); \ i >= 0 && (module = modules[i]); \ i--) /* Interface for handling single modules */ void register_module_options(struct module *module); void unregister_module_options(struct module *module); void init_module(struct module *module); void done_module(struct module *module); /* Interface for handling builtin modules */ /* Builtin modules are initialised only when not connecting to a master * terminal. */ extern struct module *builtin_modules[]; /* Main modules are initialised earlier and are not listed in Help -> About. */ extern struct module *main_modules[]; void register_modules_options(struct module *modules[]); void unregister_modules_options(struct module *modules[]); void init_modules(struct module *modules[]); void done_modules(struct module *modules[]); #ifdef __cplusplus } #endif #endif