/*
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
*
****************************************************************************/
syntax highlighted by Code2HTML, v. 0.9.1