/* IRCfs - IRC FileServ for *nix. * Copyright (C) 2002 Nick 'Zaf' Clifford * For licensing details, refer to the LICENSE file in the source * code directory. */ #ifndef __module_h__ #define __module_h__ #include "debug.h" extern DEBUG module_debug; typedef int (* const module_func_t)(void); #define MODULE_NAME(x) static const char module_name[]={x} #define MODULE_INIT(x) int x(void); static module_func_t _module_init=x #define MODULE_POST(x) int x(void) #define MODULE_DESTROY(x) int x(void); static module_func_t _module_destroy=x #define MODULE_DEPENDS(...) static const char *_module_depends[]={"" , ## __VA_ARGS__ , NULL} #define MODULE_LOADED() (_module_info.loaded) #define ASSERT_MODULE_LOADED() { if (_module_info.loaded == 0) { \ error(module_debug,"MODULE_LOADED ASSERTION %s:%d "\ "module %s not "\ "loaded.",\ __FILE__,__LINE__,\ _module_info.name);\ }\ } struct module { const char *name; int (*init)(void); int (*destroy)(void); int loaded; const char **depends; }; #define MODULE_REGISTER(x) \ static struct module _module_info;\ int module__ ## x ## __init(void) {\ _module_info.name = module_name; \ _module_info.depends = _module_depends; \ _module_info.init = _module_init; \ _module_info.destroy = _module_destroy; \ register_module(&_module_info); \ return 0; \ } int load_modules(); int init_modules(); void register_module(struct module *modinfo); int unload_modules(); int module_check_load(const char *name); #endif