/*
 *	(c) Copyright 1991 Sun Microsystems, Inc.  All rights reserved.
 *	See LEGAL_NOTICE file for terms and restrictions.
 */

#ifndef _LIST_H
#define _LIST_H

/* @(#)list.h 1.6 91/05/06 */

#ifndef NULL
#define NULL 0
#endif

typedef struct _node {
	struct _node   *prev;
	struct _node   *next;
	void           *handle;
}               Listnode;

#define list_next(node)		(node ? ((Listnode*)node)->next : NULL)
#define list_prev(node)		(node ? ((Listnode*)node)->prev : NULL)
#define list_handle(node)	(node ? ((Listnode*)node)->handle : NULL)

#define list_for(node)		for(node = list_first(node); 	\
 				    node; 			\
 				    node = list_next(node))

#define list_rof(node)		for(node = list_last(node); 	\
 				    node; 			\
 				    node = list_prev(node))

#define list_copy(node)		list_dup(node, sizeof(Listnode))
#define list_alloc_node()	(Listnode*)calloc(1, sizeof(Listnode))

extern Listnode *list_insert_after( /* node *//* new_element */ );
extern Listnode *list_insert_before( /* node *//* new_element */ );
extern void     list_destroy( /* node */ );

extern Listnode *list_first( /* node */ );
extern Listnode *list_last( /* node */ );
extern Listnode *list_unlink_node( /* node */ );
extern Listnode *list_delete_node( /* node */ ); /* same as unlink, plus frees the node */
extern Listnode *list_dup( /* node *//* size */ );
extern Listnode *list_concat( /* node *//* node */ );
extern Listnode *list_find( /* node *//* handle */ );

extern void     list_traverse( /* node *//* function *//* call_data */ );
#endif
