Blame synfig-osx/launcher/x-hook.c

Carlos Lopez a09598
/* x-hook.c
Carlos Lopez a09598
   $Id: x-hook.c,v 1.2 2003/04/16 00:42:14 jharper Exp $
Carlos Lopez a09598
Carlos Lopez a09598
   Copyright (c) 2003 Apple Computer, Inc. All rights reserved.
Carlos Lopez a09598
Carlos Lopez a09598
   Permission is hereby granted, free of charge, to any person
Carlos Lopez a09598
   obtaining a copy of this software and associated documentation files
Carlos Lopez a09598
   (the "Software"), to deal in the Software without restriction,
Carlos Lopez a09598
   including without limitation the rights to use, copy, modify, merge,
Carlos Lopez a09598
   publish, distribute, sublicense, and/or sell copies of the Software,
Carlos Lopez a09598
   and to permit persons to whom the Software is furnished to do so,
Carlos Lopez a09598
   subject to the following conditions:
Carlos Lopez a09598
Carlos Lopez a09598
   The above copyright notice and this permission notice shall be
Carlos Lopez a09598
   included in all copies or substantial portions of the Software.
Carlos Lopez a09598
Carlos Lopez a09598
   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
Carlos Lopez a09598
   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
Carlos Lopez a09598
   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
Carlos Lopez a09598
   NONINFRINGEMENT.  IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT
Carlos Lopez a09598
   HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
Carlos Lopez a09598
   WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
Carlos Lopez a09598
   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
Carlos Lopez a09598
   DEALINGS IN THE SOFTWARE.
Carlos Lopez a09598
Carlos Lopez a09598
   Except as contained in this notice, the name(s) of the above
Carlos Lopez a09598
   copyright holders shall not be used in advertising or otherwise to
Carlos Lopez a09598
   promote the sale, use or other dealings in this Software without
Carlos Lopez a09598
   prior written authorization. */
Carlos Lopez a09598
Carlos Lopez a09598
#include "x-hook.h"
Carlos Lopez a09598
#include <stdlib.h></stdlib.h>
Carlos Lopez a09598
#include <assert.h></assert.h>
Carlos Lopez a09598
Carlos Lopez a09598
#define CELL_NEW(f,d) X_PFX (list_prepend) ((x_list *) (f), (d))
Carlos Lopez a09598
#define CELL_FREE(c)  X_PFX (list_free_1) (c)
Carlos Lopez a09598
#define CELL_FUN(c)   ((x_hook_function *) ((c)->next))
Carlos Lopez a09598
#define CELL_DATA(c)  ((c)->data)
Carlos Lopez a09598
Carlos Lopez a09598
X_EXTERN x_list *
Carlos Lopez a09598
X_PFX (hook_add) (x_list *lst, x_hook_function *fun, void *data)
Carlos Lopez a09598
{
Carlos Lopez a09598
    return X_PFX (list_prepend) (lst, CELL_NEW (fun, data));
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
X_EXTERN x_list *
Carlos Lopez a09598
X_PFX (hook_remove) (x_list *lst, x_hook_function *fun, void *data)
Carlos Lopez a09598
{
Carlos Lopez a09598
    x_list *node, *cell;
Carlos Lopez a09598
    x_list *to_delete = NULL;
Carlos Lopez a09598
Carlos Lopez a09598
    for (node = lst; node != NULL; node = node->next)
Carlos Lopez a09598
    {
Carlos Lopez a09598
	cell = node->data;
Carlos Lopez a09598
	if (CELL_FUN (cell) == fun && CELL_DATA (cell) == data)
Carlos Lopez a09598
	    to_delete = X_PFX (list_prepend) (to_delete, cell);
Carlos Lopez a09598
    }
Carlos Lopez a09598
Carlos Lopez a09598
    for (node = to_delete; node != NULL; node = node->next)
Carlos Lopez a09598
    {
Carlos Lopez a09598
	cell = node->data;
Carlos Lopez a09598
	lst = X_PFX (list_remove) (lst, cell);
Carlos Lopez a09598
	CELL_FREE (cell);
Carlos Lopez a09598
    }
Carlos Lopez a09598
Carlos Lopez a09598
    X_PFX (list_free) (to_delete);
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
X_EXTERN void
Carlos Lopez a09598
X_PFX (hook_run) (x_list *lst, void *arg)
Carlos Lopez a09598
{
Carlos Lopez a09598
    x_list *node, *cell;
Carlos Lopez a09598
    x_hook_function **fun;
Carlos Lopez a09598
    void **data;
Carlos Lopez a09598
    int length, i;
Carlos Lopez a09598
Carlos Lopez a09598
    length = X_PFX (list_length) (lst);
Carlos Lopez a09598
    fun = alloca (sizeof (x_hook_function *) * length);
Carlos Lopez a09598
    data = alloca (sizeof (void *) * length);
Carlos Lopez a09598
Carlos Lopez a09598
    for (i = 0, node = lst; node != NULL; node = node->next, i++)
Carlos Lopez a09598
    {
Carlos Lopez a09598
	cell = node->data;
Carlos Lopez a09598
	fun[i] = CELL_FUN (cell);
Carlos Lopez a09598
	data[i] = CELL_DATA (cell);
Carlos Lopez a09598
    }
Carlos Lopez a09598
Carlos Lopez a09598
    for (i = 0; i < length; i++)
Carlos Lopez a09598
    {
Carlos Lopez a09598
	(*fun[i]) (arg, data[i]);
Carlos Lopez a09598
    }
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
X_EXTERN void
Carlos Lopez a09598
X_PFX (hook_free) (x_list *lst)
Carlos Lopez a09598
{
Carlos Lopez a09598
    x_list *node;
Carlos Lopez a09598
Carlos Lopez a09598
    for (node = lst; node != NULL; node = node->next)
Carlos Lopez a09598
    {
Carlos Lopez a09598
	CELL_FREE (node->data);
Carlos Lopez a09598
    }
Carlos Lopez a09598
Carlos Lopez a09598
    X_PFX (list_free) (lst);
Carlos Lopez a09598
}