Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
BitchX
GitHub Repository: BitchX/BitchX1.3
Path: blob/master/dll/possum/llist.c
1069 views
1
#include <stdlib.h>
2
#include "llist.h"
3
4
llist *lmake(size_t size) {
5
llist *l;
6
l = (llist *) malloc(sizeof(llist));
7
if (l) {
8
l->first = l->last = l->current = NULL;
9
l->size = size;
10
l->length = 0;
11
} else l = NULL; /* just making sure malloc returns NULL on a fail */
12
return (l);
13
}
14
15
int ldelete(llist *l) {
16
int retval;
17
if (l) {
18
l->current = l->first; /* make sure we are at the start */
19
while (l->first) {
20
l->current = l->first; /* save the position */
21
l->first = l->first->next; /* save the next position */
22
23
free(l->current->object);
24
free(l->current);
25
}
26
free(l);
27
retval = 0; /* all done deleting */
28
} else
29
retval = 0; /* yeah we deleted nothing */
30
31
return(retval);
32
}
33
34
int lpush(llist *l, void *object) {
35
lnode *new_node;
36
int retval;
37
38
new_node = (lnode *) malloc(sizeof(lnode));
39
if (new_node) {
40
new_node->object = (void *) malloc(l->size);
41
if (new_node->object) {
42
new_node->next = new_node->prev = NULL;
43
memcpy(new_node->object, object, l->size);
44
l->length++;
45
46
if (l->first == NULL) l->first = l->last = l->current = new_node;
47
else if (l->last) {
48
l->last->next = new_node;
49
new_node->prev = l->last;
50
l->last = l->last->next;
51
}
52
retval = 0;
53
} else {
54
free(new_node);
55
retval = 1;
56
}
57
} else
58
retval = 1;
59
60
return(retval);
61
}
62
63
void *lindex(llist *l, size_t x) {
64
int z;
65
lnode *tmp = NULL;
66
void *retval;
67
68
/* while (x > l->length)
69
x = x - l->length; *//* we are allowed to wrap the list */
70
if (x > l->length) return NULL;
71
72
l->current = l->first;
73
74
for (z = 0; z <= x; z++) {
75
if (!l->current) break;
76
tmp = l->current;
77
l->current = l->current->next;
78
}
79
80
if (tmp)
81
retval = tmp->object;
82
else
83
retval = NULL;
84
85
return(retval);
86
}
87
88