/* $Log: list.h,v $ Revision 1.2 2000/10/10 08:50:01 ivo some annotation for lclint Revision 1.1 1997/08/04 21:05:32 walter Initial revision */ #ifndef __LIST_H #define __LIST_H /*---------------------- Macros and type definitions ----------------------*/ typedef struct LST_BUCKET { struct LST_BUCKET *next; } LST_BUCKET; typedef struct { int count; /* Number of elements currently in list */ LST_BUCKET *head; /* Pointer to head element of list */ LST_BUCKET *z; /* Pointer to last node of list */ LST_BUCKET hz[2]; /* Space for head and z nodes */ } LIST; /* Return a pointer to the user space given the address of the header of * a node. */ #define LST_USERSPACE(h) ((void*)((LST_BUCKET*)(h) + 1)) /* Return a pointer to the header of a node, given the address of the * user space. */ #define LST_HEADER(n) ((LST_BUCKET*)(n) - 1) /* Return a pointer to the user space of the list's head node. This user * space does not actually exist, but it is useful to be able to address * it to enable insertion at the start of the list. */ #define LST_HEAD(l) LST_USERSPACE((l)->head) /* Determine if a list is empty */ #define LST_EMPTY(l) ((l)->count == 0) /*-------------------------- Function Prototypes --------------------------*/ /*@only@*//*@out@*/ void *lst_newnode (int size); void lst_freenode (/*@only@*/ void *node); /*@only@*//*@out@*/ LIST *lst_init (void); void lst_kill (LIST * l, void (*freeNode) ()); void lst_insertafter (LIST * l, /*@keep@*/ void *node, void *after); void *lst_deletenext (/*@only@*/ LIST * l, void *node); /*@dependent@*/ void *lst_first (LIST * l); /*@dependent@*/ void *lst_next (void *prev); void lst_mergesort (LIST * l, int (*cmp_func) ()); #endif