#ifndef MPLIB1_DL_LIST #define MPLIB1_DL_LIST /* ******************************************************************************* * Copyright (c) 1996 Martin Poole * ******************************************************************************* ** ** WARNING !! WARNING !! WARNING !! WARNING !! WARNING !! WARNING !! ** ** Any changes to be made to this file should first be checked with ** mplib1 source control for library integrity. ** ** mplib1 source control can be reached at mplib1@quatermass.co.uk ** * * $Source$ * $Author$ * $Date$ * $Revision$ * Purpose : Double-linked List/Node definitions * ******************************************************************************* * * Change History * * $Log$ * ******************************************************************************* */ #ident "$Header$" /* ------------------------------------------------------------------ defines ------------------------------------------------------------------ */ #ifndef BIT #define BIT(x) (1<<(x)) #endif /* ------------------------------------------------------------------ structures ------------------------------------------------------------------ */ #define DL_NODE_TYPE dl_Node_s #define DL_LIST_TYPE dl_List_s struct dl_Node_s { struct dl_Node_s *ln_Succ; struct dl_Node_s *ln_Pred; char *ln_Name; void *ln_Item; struct dl_List_s *ln_List; }; struct dl_List_s { struct dl_Node_s ln_Head; struct dl_Node_s ln_Tail; int ln_Flags; }; typedef struct dl_Node_s dl_Node_t; typedef struct dl_List_s dl_List_t; #define NODE_SIZE sizeof(dl_Node_t) #define LIST_SIZE sizeof(dl_List_t) #define DL_REMOVE_NODES BIT(0) #define DL_FREE_NODES BIT(1) #define DL_FREE_ITEMS BIT(2) #define DL_FREE_NAMES BIT(3) typedef void (* dl_Walk_List_t)( void *, void *); typedef int (* dl_Walk_List2_t)( void *, void *); typedef int (* dl_Walk_List_Name_t)( void *, void *); typedef int (* dl_Walk_List_Node_t)( dl_Node_t *, void *); typedef int (* dl_sort_i_t)( const void *, const void *); /* ------------------------------------------------------------------ function definitions ------------------------------------------------------------------ */ extern dl_List_t *dl_Init_List ( dl_List_t *list, int flags ); extern dl_Node_t *dl_Init_Node( dl_Node_t *node, const char *name, const void *item ); extern int dl_Any_In_List( dl_List_t *list ); extern dl_Node_t *dl_Remove_Node( dl_Node_t *node1 ); extern dl_Node_t *dl_Remove_Head( dl_List_t *list ); extern dl_Node_t *dl_Remove_Tail( dl_List_t *list ); extern dl_Node_t *dl_Add_Node_After( dl_Node_t *node1, dl_Node_t *node2 ); extern dl_Node_t *dl_Add_Node_Before( dl_Node_t *node1, dl_Node_t *node2 ); extern dl_Node_t *dl_Add_Head( dl_List_t *list, dl_Node_t *node ); extern dl_Node_t *dl_Add_Tail( dl_List_t *list, dl_Node_t *node ); extern void *dl_Find_Item_By_Name( dl_List_t *list, const char *name ); extern void *dl_Find_Next_Item_By_Name( dl_Node_t *node, const char *name ); extern dl_Node_t *dl_Find_Node_By_Item( dl_List_t *list, const void *item ); extern void * dl_Remove_Head_Item( dl_List_t *list ); extern void * dl_Remove_Tail_Item( dl_List_t *list ); extern int dl_Walk_List( dl_List_t *l_ptr, dl_Walk_List_t disp, void *param ); extern int dl_Walk_List2( dl_List_t *l_ptr, dl_Walk_List2_t disp, void *param ); extern int dl_Walk_List_Name( dl_List_t *l_ptr, const char *name, dl_Walk_List_Name_t disp, void *param ); extern int dl_Transfer_Lists( dl_List_t *fl_ptr, dl_List_t *tl_ptr ); extern int dl_Walk_List_By_Node( dl_List_t *l_ptr, dl_Walk_List_Node_t disp, void *param ); extern int dl_Free_List_Contents( dl_List_t *l_ptr ); extern void dl_Free_Node( dl_Node_t *n_ptr, int flags ); extern void dl_Free_List( dl_List_t *l_ptr, int flags ); extern int dl_sort_i( dl_List_t *sort_list, dl_sort_i_t compar ); /* int (*compar)(const void *, const void *) );*/ extern int dl_sort_n( dl_List_t *sort_list ); #endif /* -- End of File -- */