cscvs to tla changeset 1
[onak.git] / ll.c
1 /*
2  * ll.c - various things of used for dealing with linked lists.
3  *
4  * Jonathan McDowell <noodles@earth.li>
5  *
6  * Copyright 2000-2002 Project Purple
7  */
8
9 #include <assert.h>
10 #include <stdio.h>
11 #include <stdlib.h>
12
13 #include "ll.h"
14
15 struct ll *lladd(struct ll *curll, void *object)
16 {
17         struct ll *new;
18
19         if ((new = malloc(sizeof(struct ll))) == NULL) {
20                 perror("lladd()");
21                 printf("Got NULL in lladd()\n");
22                 return NULL;
23         }
24
25         new->next = curll;
26         new->object = object;
27
28         return new;
29 }
30
31 struct ll *lldel(struct ll *curll, void *object,
32         int (*objectcmp) (const void *object1, const void *object2))
33 {
34         struct ll *cur;
35
36         assert(objectcmp != NULL);
37
38         cur = curll;
39         if (cur == NULL) {
40                 return NULL;
41         } else if (!(*objectcmp)(cur->object, object)) {
42                 return cur->next;
43         } 
44         while (cur->next != NULL) {
45                 if (!(*objectcmp)(cur->next->object, object)) {
46                         cur->next = cur->next->next;
47                         break;
48                 }
49         }
50         return curll;
51 }
52
53 struct ll *llfind(struct ll *curll, void *object,
54         int (*objectcmp) (const void *object1, const void *object2))
55 {
56         struct ll *cur;
57
58         cur = curll;
59         while (cur != NULL && (*objectcmp)(cur->object, object)) {
60                 cur = cur->next;
61         }
62         return cur;
63 }
64
65 unsigned long llsize(struct ll *curll)
66 {
67         unsigned long count = 0;
68
69         while (curll != NULL) {
70                 count++;
71                 curll = curll->next;
72         }
73
74         return count;
75 }