/* core/func.cc This file is part of the Osirion project and is distributed under the terms of the GNU General Public License version 2 */ #include #include #include #include "sys/sys.h" #include "core/func.h" namespace core { /* ---- Static functions for the Func registry -------------------- */ Func::Registry Func::func_registry; Func * Func::add(const char *name, FuncPtr functionptr, bool shared) { if (!name || !functionptr) return 0; Func *func = 0; Registry::iterator it = func_registry.find(name); if (it == func_registry.end()) { std::string funcname(name); func = new Func(funcname.c_str(), (void *)functionptr, shared ? Shared : 0); func_registry[func->name()] = func; //con_debug << "Function '" << name << "' registered." << std::endl; } else { con_warn << "Function '" << name << "' already registered!" << std::endl; func = (*it).second; } return func; } Func *Func::add(const char *name, GameFuncPtr gamefunctionptr) { if (!name || !gamefunctionptr) return 0; Func *func = 0; Registry::iterator it = func_registry.find(name); if (it == func_registry.end()) { std::string funcname(name); func = new Func(funcname.c_str(), (void *)gamefunctionptr, Game); func_registry[func->name()] = func; //con_debug << "Function '" << name << "' registered." << std::endl; } else { con_warn << "Function '" << name << "' already registered!" << std::endl; func = (*it).second; } return func; } Func *Func::add(const char *name, TargetFuncPtr targetfunctionptr) { if (!name || !targetfunctionptr) return 0; Func *func = 0; Registry::iterator it = func_registry.find(name); if (it == func_registry.end()) { std::string funcname(name); func = new Func(funcname.c_str(), (void *)targetfunctionptr, Game | Target); func_registry[func->name()] = func; //con_debug << "Function '" << name << "' registered." << std::endl; } else { con_warn << "Function '" << name << "' already registered!" << std::endl; func = (*it).second; } return func; } void Func::remove(const char *name) { std::map::iterator it = func_registry.find(std::string(name)); if (it != func_registry.end()) { delete(*it).second; func_registry.erase(it); //con_debug << "Function '" << name << "' unregistered." << std::endl; } } void Func::remove(const std::string &name) { std::map::iterator it = func_registry.find(name); if (it != func_registry.end()) { delete(*it).second; func_registry.erase(it); //con_debug << "Function '" << name << "' unregistered." << std::endl; } } Func *Func::find(const std::string &name) { std::map::iterator it = func_registry.find(name); if (it == func_registry.end()) return 0; else return (*it).second; } void Func::list() { Registry::iterator it; for (it = func_registry.begin(); it != func_registry.end(); it++) { std::string typeindicator; if (((*it).second->flags() & Game) == Game) typeindicator += 'G'; else typeindicator += ' '; if (((*it).second->flags() & Shared) == Shared) typeindicator += 'S'; else typeindicator += ' '; con_print << " " << typeindicator << " " << (*it).second->name() << " " << (*it).second->info() << std::endl; } con_print << "Flags: G=Game S=Shared" << std::endl; con_print << "^B " << func_registry.size() << " registered functions" << std::endl; } /* ---- Func ------------------------------------------------------ */ Func::Func(char const * name, void *ptr, unsigned int flags) { if (name) func_name.assign(name); else func_name.clear(); func_info.clear(); func_flags = flags; func_ptr = ptr; } Func::~Func() { func_name.clear(); func_ptr = 0; func_flags = 0; } void Func::set_info(const char *info) { if (info) func_info.assign(info); } void Func::exec(std::string const &args) { if ((flags() & Game)) return; FuncPtr function = (FuncPtr) func_ptr; function(args); } void Func::exec(Player *player, std::string const &args) { if (!(flags() & Game)) return; GameFuncPtr gamefunction = (GameFuncPtr) func_ptr; gamefunction(player, args); } void Func::exec(Player *player, Entity *entity) { if (!(flags() & (Game | Target))) return; TargetFuncPtr targetfunction = (TargetFuncPtr) func_ptr; targetfunction(player, entity); } } // namespace core