X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fir%2Firhooks.c;h=4e7186920b8653bfa1ed4e08014a3af8c8a3d16c;hb=69d11aa49aa17358468bbb2f5506ef5f009514e9;hp=0341f7de8d0ae26eb8cc15a1e5d284ae170991f6;hpb=5acca50aee7818fe32a6c0476579b6b568a11b20;p=libfirm diff --git a/ir/ir/irhooks.c b/ir/ir/irhooks.c index 0341f7de8..4e7186920 100644 --- a/ir/ir/irhooks.c +++ b/ir/ir/irhooks.c @@ -1,34 +1,38 @@ /* - * Project: libFIRM - * File name: ir/ir/irhooks.c - * Purpose: Generic hooks for various libFirm functions. - * Author: Michael Beck - * Created: - * CVS-ID: $Id$ - * Copyright: (C) 1998-2005 Universität Karlsruhe - * Licence: This file protected by GPL - GNU GENERAL PUBLIC LICENSE. + * Copyright (C) 1995-2008 University of Karlsruhe. All right reserved. + * + * This file is part of libFirm. + * + * This file may be distributed and/or modified under the terms of the + * GNU General Public License version 2 as published by the Free Software + * Foundation and appearing in the file LICENSE.GPL included in the + * packaging of this file. + * + * Licensees holding valid libFirm Professional Edition licenses may use + * this file in accordance with the libFirm Commercial License. + * Agreement provided with the Software. + * + * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE + * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE. */ /** - * @file irhooks.c - * - * Generic hooks for various libFirm functions. - * - * @author Michael Beck + * @file + * @brief Generic hooks for various libFirm functions. + * @author Michael Beck + * @version $Id$ */ -#ifdef HAVE_CONFIG_H #include "config.h" -#endif #include "irhooks.h" -#ifdef FIRM_ENABLE_HOOKS - /* the hooks */ hook_entry_t *hooks[hook_last]; /* register a hook */ void register_hook(hook_type_t hook, hook_entry_t *entry) { + /* check if a hook function is specified. It's a union, so no matter which one */ if (! entry->hook._hook_turn_into_id) return; @@ -36,8 +40,27 @@ void register_hook(hook_type_t hook, hook_entry_t *entry) { hooks[hook] = entry; } -#else +/* unregister a hook */ +void unregister_hook(hook_type_t hook, hook_entry_t *entry) { + hook_entry_t *p; + + if (hooks[hook] == entry) { + hooks[hook] = entry->next; + entry->next = NULL; + return; + } + + for (p = hooks[hook]; p && p->next != entry; p = p->next); -void register_hook(hook_type_t hook, hook_entry_t *entry) {} + if (p) { + p->next = entry->next; + entry->next = NULL; + } +} -#endif /* FIRM_ENABLE_HOOKS */ +int firm_init_hooks(void) { + /* this strange code assures that both functions are available + in a shared library even if none of them is called. + Meanwhile not needed anymore but ... */ + return (int)register_hook + (int)unregister_hook; +}