svn commit: trunk/busybox/libbb

vda at busybox.net vda at busybox.net
Tue Jan 13 15:22:50 UTC 2009


Author: vda
Date: 2009-01-13 15:22:50 +0000 (Tue, 13 Jan 2009)
New Revision: 24816

Log:
libbb: shrink linked list ops (by xmaks AT email.cz)

function                                             old     new   delta
llist_pop                                             33      29      -4
llist_unlink                                          47      28     -19
llist_add_to_end                                      50      31     -19
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 0/3 up/down: 0/-42)             Total: -42 bytes



Modified:
   trunk/busybox/libbb/llist.c


Changeset:
Modified: trunk/busybox/libbb/llist.c
===================================================================
--- trunk/busybox/libbb/llist.c	2009-01-13 15:14:21 UTC (rev 24815)
+++ trunk/busybox/libbb/llist.c	2009-01-13 15:22:50 UTC (rev 24816)
@@ -25,56 +25,38 @@
 /* Add data to the end of the linked list.  */
 void FAST_FUNC llist_add_to_end(llist_t **list_head, void *data)
 {
-	llist_t *new_item = xmalloc(sizeof(llist_t));
-
-	new_item->data = data;
-	new_item->link = NULL;
-
-	if (!*list_head)
-		*list_head = new_item;
-	else {
-		llist_t *tail = *list_head;
-
-		while (tail->link)
-			tail = tail->link;
-		tail->link = new_item;
-	}
+	while (*list_head)
+		list_head = &(*list_head)->link;
+	*list_head = xzalloc(sizeof(llist_t));
+	(*list_head)->data = data;
+	/*(*list_head)->link = NULL;*/
 }
 
 /* Remove first element from the list and return it */
 void* FAST_FUNC llist_pop(llist_t **head)
 {
-	void *data, *next;
+	void *data = NULL;
+	llist_t *temp = *head;
 
-	if (!*head)
-		return NULL;
-
-	data = (*head)->data;
-	next = (*head)->link;
-	free(*head);
-	*head = next;
-
+	if (temp) {
+		data = temp->data;
+		*head = temp->link;
+		free(temp);
+	}
 	return data;
 }
 
 /* Unlink arbitrary given element from the list */
 void FAST_FUNC llist_unlink(llist_t **head, llist_t *elm)
 {
-	llist_t *crt;
-
-	if (!(elm && *head))
+	if (!elm)
 		return;
-
-	if (elm == *head) {
-		*head = (*head)->link;
-		return;
-	}
-
-	for (crt = *head; crt; crt = crt->link) {
-		if (crt->link == elm) {
-			crt->link = elm->link;
-			return;
+	while (*head) {
+		if (*head == elm) {
+			*head = (*head)->link;
+			break;
 		}
+		head = &(*head)->link;
 	}
 }
 



More information about the busybox-cvs mailing list