libbb: shrink linked list ops (by xmaks AT email.cz)
authorDenis Vlasenko <vda.linux@googlemail.com>
Tue, 13 Jan 2009 15:22:50 +0000 (15:22 -0000)
committerDenis Vlasenko <vda.linux@googlemail.com>
Tue, 13 Jan 2009 15:22:50 +0000 (15:22 -0000)
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

libbb/llist.c

index 7e78f7cb4ca63817fa77ddbcaab634a9614366a1..5ba7f6047a98b5eb608509f4c851cd2fe0c5a3ee 100644 (file)
@@ -25,56 +25,38 @@ void FAST_FUNC llist_add_to(llist_t **old_head, void *data)
 /* 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;
-
-       if (!*head)
-               return NULL;
-
-       data = (*head)->data;
-       next = (*head)->link;
-       free(*head);
-       *head = next;
+       void *data = NULL;
+       llist_t *temp = *head;
 
+       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))
-               return;
-
-       if (elm == *head) {
-               *head = (*head)->link;
+       if (!elm)
                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;
        }
 }