Sat, 26 Feb 2005 10:37:20 +0100
Added struct field address macros.
/* * libtu/symlist.c * * Copyright (c) Tuomo Valkonen 1999-2004. * * You may distribute and modify this library under the terms of either * the Clarified Artistic License or the GNU LGPL, version 2.1 or later. */ #include "obj.h" #include "symlist.h" #include "types.h" #include "dlist.h" #include "misc.h" static void free_node(Symlist **symlist, Symlist *node) { UNLINK_ITEM(*symlist, node, next, prev); free(node); } static Symlist *mknode(void *symbol) { Symlist *node; if(symbol==NULL) return NULL; node=ALLOC(Symlist); if(node==NULL) return FALSE; node->symbol=symbol; return node; } static Symlist *symlist_find_node(Symlist *symlist, void *symbol) { Symlist *node=symlist; while(node!=NULL){ if(node->symbol==symbol) break; node=node->next; } return node; } bool symlist_insert_last(Symlist **symlist, void *symbol) { Symlist *node=mknode(symbol); if(node==NULL) return FALSE; LINK_ITEM_LAST(*symlist, node, next, prev); return TRUE; } bool symlist_insert_first(Symlist **symlist, void *symbol) { Symlist *node=mknode(symbol); if(node==NULL) return FALSE; LINK_ITEM_FIRST(*symlist, node, next, prev); return TRUE; } bool symlist_reinsert_last(Symlist **symlist, void *symbol) { Symlist *node=symlist_find_node(*symlist, symbol); if(node==NULL) return FALSE; UNLINK_ITEM(*symlist, node, next, prev); LINK_ITEM_LAST(*symlist, node, next, prev); return TRUE; } bool symlist_reinsert_first(Symlist **symlist, void *symbol) { Symlist *node=symlist_find_node(*symlist, symbol); if(node==NULL) return FALSE; UNLINK_ITEM(*symlist, node, next, prev); LINK_ITEM_FIRST(*symlist, node, next, prev); return TRUE; } void symlist_remove(Symlist **symlist, void *symbol) { Symlist *node=symlist_find_node(*symlist, symbol); if(node!=NULL) free_node(symlist, node); } void symlist_clear(Symlist **symlist) { while(*symlist!=NULL) free_node(symlist, *symlist); } SymlistIterTmp symlist_iter_tmp=NULL; void symlist_iter_init(SymlistIterTmp *state, Symlist *symlist) { *state=symlist; } void *symlist_iter(SymlistIterTmp *state) { void *symbol=NULL; if(*state!=NULL){ symbol=(*state)->symbol; (*state)=(*state)->next; } return symbol; } void symlist_iter_rev_init(SymlistIterTmp *state, Symlist *symlist) { *state=(symlist==NULL ? NULL : symlist->prev); } void *symlist_iter_rev(SymlistIterTmp *state) { void *symbol=NULL; if(*state!=NULL){ symbol=(*state)->symbol; *state=(*state)->prev; if((*state)->next==NULL) *state=NULL; } return symbol; }