1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
62
63
73
74
75
76
77
78
79
93
94
95
96
97
98
99
100
101
102
103
104
105
106
/* ... */
#include <stdlib.h>
#include "libjaylink-internal.h"
/* ... */
JAYLINK_PRIV struct list *list_prepend(struct list *list, void *data)
{
struct list *item;
item = malloc(sizeof(struct list));
if (!item)
return NULL;
item->data = data;
item->next = list;
return item;
}{ ... }
JAYLINK_PRIV struct list *list_remove(struct list *list, const void *data)
{
struct list *item;
struct list *tmp;
if (!list)
return NULL;
item = list;
if (item->data == data) {
tmp = item->next;
free(item);
return tmp;
}if (item->data == data) { ... }
while (item->next) {
if (item->next->data == data) {
tmp = item->next;
item->next = item->next->next;
free(tmp);
break;
}if (item->next->data == data) { ... }
item = item->next;
}while (item->next) { ... }
return list;
}{ ... }
JAYLINK_PRIV struct list *list_find_custom(struct list *list,
list_compare_callback callback, const void *user_data)
{
if (!callback)
return NULL;
while (list) {
if (callback(list->data, user_data))
return list;
list = list->next;
}while (list) { ... }
return NULL;
}{ ... }
JAYLINK_PRIV size_t list_length(struct list *list)
{
size_t length;
for (length = 0; list; length++)
list = list->next;
return length;
}{ ... }
JAYLINK_PRIV void list_free(struct list *list)
{
struct list *tmp;
while (list) {
tmp = list;
list = list->next;
free(tmp);
}while (list) { ... }
}{ ... }