/* 
   elmo - ELectronic Mail Operator

   Copyright (C) 2003, 2004 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"
#include "run.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->prog   = NULL;
        result->next   = NULL;
        return result;
}


hook_t *
hook_create_prog (char *prog)
{
        hook_t *result = xmalloc (sizeof (hook_t));
        result->action = NULL;
        result->prog   = prog;
        result->next   = NULL;
        return result;
}
        


hook_t *
hook_make_copy (hook_t *hook)
{
        hook_t *result;
        
        if (hook == NULL)
                return NULL;

        result         = xmalloc (sizeof (hook_t));
        result->action = hook->action;
        result->prog   = hook->prog;
        result->next   = hook_make_copy (hook->next);
        return result;
}



hook_t *
hook_add (hook_t *hook, void (*action)(void))
{
        hook_t *result = hook;
        
        if (result == NULL){
                result = hook_create (action);
        }
        else {
                while (hook->next)
                        hook = hook->next;
                hook->next = hook_create (action);
        }
        return result;
}


hook_t *
hook_add_prog (hook_t *hook, char *prog)
{
        hook_t *result = hook;

        if (result == NULL){
                result = hook_create_prog (prog);
        }
        else {
                while (hook->next)
                        hook = hook->next;
                hook->next = hook_create_prog (prog);
        }
        return result;
}


hook_t *
hook_copy (hook_t *hook, hook_t *orig)
{
        hook_t *result = hook;

        if (result == NULL){
                result = hook_make_copy (orig);
        }
        else {
                while (hook->next)
                        hook = hook->next;
                hook->next = hook_make_copy (orig);
        }
        return result;
}


void
hook_destroy (hook_t *hook)
{
        hook_t *tmp;

        if (hook == NULL)
                return;
  
        hook = hook->next;
        while (hook){
                tmp = hook->next;
                if (hook->prog)
                        xfree (hook->prog);
                xfree (hook);
                hook = tmp;
        }
}


void
hook_execute (hook_t *hook)
{
        while (hook){
                if (hook->action)
                        hook->action ();
                else if (hook->prog)
                        run (hook->prog);
                hook = hook->next;
        }
}


/****************************************************************************
 *    INTERFACE CLASS BODIES
 ****************************************************************************/
/****************************************************************************
 *
 *    END MODULE hook.c
 *
 ****************************************************************************/


syntax highlighted by Code2HTML, v. 0.9.1