From 3ee7e6bd6082cfe56fa0eb88da68549922d3b474 Mon Sep 17 00:00:00 2001
From: rswindell <>
Date: Tue, 9 Nov 2004 23:54:05 +0000
Subject: [PATCH] Introduced listInit() flag: LINK_LIST_DONT_FREE, which causes
 node data to *not* be freed when removing (but still freed when freeing the
 list). Changed listFindNode data arg to const *.

---
 src/xpdev/link_list.c |  4 ++--
 src/xpdev/link_list.h | 16 +++++++++-------
 2 files changed, 11 insertions(+), 9 deletions(-)

diff --git a/src/xpdev/link_list.c b/src/xpdev/link_list.c
index c564edc343..dadfe1d871 100644
--- a/src/xpdev/link_list.c
+++ b/src/xpdev/link_list.c
@@ -258,7 +258,7 @@ long listCountNodes(const link_list_t* list)
 	return(count);
 }
 
-list_node_t* listFindNode(const link_list_t* list, void* data, size_t length)
+list_node_t* listFindNode(const link_list_t* list, const void* data, size_t length)
 {
 	list_node_t* node;
 
@@ -642,7 +642,7 @@ void* listRemoveNode(link_list_t* list, list_node_t* node)
 		list->last = node->prev;
 
 	if((list->flags&LINK_LIST_ALWAYS_FREE || node->flags&LINK_LIST_MALLOC)
-		&& !(list->flags&LINK_LIST_NEVER_FREE))
+		&& !(list->flags&LINK_LIST_DONT_FREE))
 		listFreeNodeData(node);
 
 	data = node->data;
diff --git a/src/xpdev/link_list.h b/src/xpdev/link_list.h
index ee44b041cc..b68cba34e4 100644
--- a/src/xpdev/link_list.h
+++ b/src/xpdev/link_list.h
@@ -54,12 +54,13 @@ extern "C" {
 
 /* Valid link_list_t.flags bits */
 #define LINK_LIST_MALLOC		(1<<0)	/* List/node allocated with malloc() */
-#define LINK_LIST_ALWAYS_FREE	(1<<1)	/* ALWAYS free node data when removing */
-#define LINK_LIST_NEVER_FREE	(1<<2)	/* NEVER free node data when removing */
-#define LINK_LIST_MUTEX			(1<<3)	/* Mutex-protected linked-list */
-#define LINK_LIST_SEMAPHORE		(1<<4)	/* Semaphore attached to linked-list */
-#define LINK_LIST_NODE_LOCKED	(1<<5)	/* Node is locked */
-#define LINK_LIST_ATTACH		(1<<6)	/* Attach during init */
+#define LINK_LIST_DONT_FREE		(1<<1)	/* Don't free node data when removing */
+#define LINK_LIST_ALWAYS_FREE	(1<<2)	/* ALWAYS free node data when removing */
+#define LINK_LIST_NEVER_FREE	(1<<3)	/* NEVER free node data (careful of memory leaks!) */
+#define LINK_LIST_MUTEX			(1<<4)	/* Mutex-protected linked-list */
+#define LINK_LIST_SEMAPHORE		(1<<5)	/* Semaphore attached to linked-list */
+#define LINK_LIST_NODE_LOCKED	(1<<6)	/* Node is locked */
+#define LINK_LIST_ATTACH		(1<<7)	/* Attach during init */
 
 typedef struct list_node {
 	void*				data;			/* pointer to some kind of data */
@@ -123,7 +124,7 @@ link_list_t*	listExtract(link_list_t* dest_list, const list_node_t* src_node, lo
 
 /* Simple search functions returning found node or NULL on error */
 list_node_t*	listNodeAt(const link_list_t*, long index);
-list_node_t*	listFindNode(const link_list_t*, void* data, size_t length);
+list_node_t*	listFindNode(const link_list_t*, const void* data, size_t length);
 
 /* Convenience functions */
 list_node_t*	listFirstNode(const link_list_t*);
@@ -172,6 +173,7 @@ BOOL			listSwapNodes(list_node_t* node1, list_node_t* node2);
 #define	listPushStringList(list, str_list)		listAddStringList(list, str_list, listLastNode(list))
 #define listInsertStringList(list, str_list)	listAddStringList(list, str_list, FIRST_NODE)
 #define listPopNode(list)						listRemoveNode(list, listLastNode(list))
+#define listPopFirstNode(list)					listRemoveNode(list, FIRST_NODE)
 
 /* Remove node from list, returning the node's data (if not free'd) */
 void*			listRemoveNode(link_list_t*, list_node_t* /* NULL=first */);
-- 
GitLab