#ifndef __Z_LIST_H
#define __Z_LIST_H

/*
	Linked List structure

	All items contained in this list but be pointers.  The list does not claim 
	"ownership" of the data, so it is not the responsibility of the list to 
	free the memory allocated by the data.  It will, however, free the memory taken 
	by the nodes
*/

// dummy for internals
struct listNode_s;

typedef struct list_s
{
	// start of the list
	struct listNode_s *head;
	struct listNode_s *tail;

	// # of nodes in the list
	int numNodes;

	// current node
	int curNode;
	struct listNode_s *currentNode;
} list_t;

// init/cleanup
void initializeList(list_t *list);
void emptyList(list_t *list);

// get information about the list
int listLength(list_t const *list);

// add items to the list
void addHead(list_t *list, void *data);
void addTail(list_t *list, void *data);

// remove items from the list
void removeItem(list_t *list, int num);

// get items from the list (0 based)
void *getItem(list_t *list, int num);
int findIndex(list_t *list, void *data);

// data transfer
void copyList(list_t *src, list_t *dest);
void stealList(list_t *src, list_t *dest);

#endif
