/* * $Source$ * $Revision$ * $Date$ * * Copyright (c) 1996-99 by Peter Simons * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * This product includes software developed by Peter Simons. * * 4. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef __LIB_LISTS_H__ #define __LIB_LISTS_H__ 1 /* For autoconf... */ #undef HAVE_STRINGS_H #include #include #ifdef HAVE_STRINGS_H /* sunos 4 needs this */ # include #endif #include #ifdef DEBUG_DMALLOC # include #endif /********** Useful defines and declarations **********/ #ifndef __cplusplus #ifndef __HAVE_DEFINED_BOOL__ # define __HAVE_DEFINED_BOOL__ 1 typedef int bool; #endif #ifndef FALSE # define FALSE (0==1) #endif #ifndef TRUE # define TRUE (1==1) #endif #endif /********** Structures **********/ struct ListHead { struct ListNode * lh_FirstNode; int (*lh_Compare)(const void *, const void *); }; typedef struct ListHead * List; struct ListNode { struct ListNode * ln_Next; struct ListNode * ln_Prev; struct ListHead * ln_Head; const void * ln_Key; const void * ln_Data; }; typedef struct ListNode * Node; /********** Prototypes **********/ List getListHead(const Node node); const void * getNodeKey(const Node node); const void * getNodeData(const Node node); void setNodeData(const Node node, const void * data); Node getFirstNode(const List head); Node getNextNode(const Node node); Node getPrevNode(const Node node); bool isListEmpty(const List head); bool isEndOfList(const Node node); List InitList(int (*compare)(const void *, const void *)); void FreeList(List head); Node AppendNode(List head, const void * key, const void * data); Node InitNode(const List head, const void * key, const void * data); void FreeNode(Node node); void RemoveNode(const Node node); Node InsertNodeBeforeNode(Node node, const void *key, const void *data); Node InsertNodeAfterNode(Node node, const void *key, const void *data); Node InsertNodeByKey(List head, const void * key, const void * data); Node FindNodeByKey(List head, const void * key); unsigned int CountElements(List); #endif /* !__LIB_LISTS_H__ */