--- /dev/null
+/*
+ $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