/* elmo - ELectronic Mail Operator Copyright (C) 2003 rzyjontko This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; version 2. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ---------------------------------------------------------------------- An implementation of hooks. */ /**************************************************************************** * IMPLEMENTATION HEADERS ****************************************************************************/ #include "hook.h" #include "xmalloc.h" /**************************************************************************** * IMPLEMENTATION PRIVATE DEFINITIONS / ENUMERATIONS / SIMPLE TYPEDEFS ****************************************************************************/ /**************************************************************************** * IMPLEMENTATION PRIVATE CLASS PROTOTYPES / EXTERNAL CLASS REFERENCES ****************************************************************************/ /**************************************************************************** * IMPLEMENTATION PRIVATE STRUCTURES / UTILITY CLASSES ****************************************************************************/ /**************************************************************************** * IMPLEMENTATION REQUIRED EXTERNAL REFERENCES (AVOID) ****************************************************************************/ /**************************************************************************** * IMPLEMENTATION PRIVATE DATA ****************************************************************************/ /**************************************************************************** * INTERFACE DATA ****************************************************************************/ /**************************************************************************** * IMPLEMENTATION PRIVATE FUNCTION PROTOTYPES ****************************************************************************/ /**************************************************************************** * IMPLEMENTATION PRIVATE FUNCTIONS ****************************************************************************/ /**************************************************************************** * INTERFACE FUNCTIONS ****************************************************************************/ hook_t * hook_create (void (*action)(void)) { hook_t *result = xmalloc (sizeof (hook_t)); result->action = action; result->next = NULL; return result; } void hook_add (hook_t *hook, void (*action)(void)) { if (hook->action == NULL){ hook->action = action; } else { while (hook->next) hook = hook->next; hook->next = hook_create (action); } } void hook_destroy (hook_t *hook) { hook_t *tmp; if (hook == NULL) return; hook = hook->next; while (hook){ tmp = hook->next; xfree (hook); hook = tmp; } } void hook_execute (hook_t *hook) { while (hook){ if (hook->action) hook->action (); hook = hook->next; } } /**************************************************************************** * INTERFACE CLASS BODIES ****************************************************************************/ /**************************************************************************** * * END MODULE hook.c * ****************************************************************************/