]>
Commit | Line | Data |
---|---|---|
82b27616 NB |
1 | |
2 | /* doubly linked lists */ | |
3 | /* This is free software. No strings attached. No copyright claimed */ | |
4 | ||
5 | #include <unistd.h> | |
6 | #include <stdlib.h> | |
7 | #include <string.h> | |
8 | #include "dlink.h" | |
9 | ||
10 | ||
11 | void *dl_head() | |
12 | { | |
13 | void *h; | |
14 | h = dl_alloc(0); | |
15 | dl_next(h) = h; | |
16 | dl_prev(h) = h; | |
17 | return h; | |
18 | } | |
19 | ||
20 | void dl_free(void *v) | |
21 | { | |
22 | struct __dl_head *vv = v; | |
23 | free(vv-1); | |
24 | } | |
25 | ||
26 | void dl_init(void *v) | |
27 | { | |
28 | dl_next(v) = v; | |
29 | dl_prev(v) = v; | |
30 | } | |
31 | ||
32 | void dl_insert(void *head, void *val) | |
33 | { | |
34 | dl_next(val) = dl_next(head); | |
35 | dl_prev(val) = head; | |
36 | dl_next(dl_prev(val)) = val; | |
37 | dl_prev(dl_next(val)) = val; | |
38 | } | |
39 | ||
40 | void dl_add(void *head, void *val) | |
41 | { | |
42 | dl_prev(val) = dl_prev(head); | |
43 | dl_next(val) = head; | |
44 | dl_next(dl_prev(val)) = val; | |
45 | dl_prev(dl_next(val)) = val; | |
46 | } | |
47 | ||
48 | void dl_del(void *val) | |
49 | { | |
50 | if (dl_prev(val) == 0 || dl_next(val) == 0) | |
51 | return; | |
52 | dl_prev(dl_next(val)) = dl_prev(val); | |
53 | dl_next(dl_prev(val)) = dl_next(val); | |
54 | dl_prev(val) = dl_next(val) = 0; | |
55 | } | |
56 | ||
57 | char *dl_strndup(char *s, int l) | |
58 | { | |
59 | char *n; | |
60 | if (s == NULL) | |
61 | return NULL; | |
62 | n = dl_newv(char, l+1); | |
63 | if (n == NULL) | |
64 | return NULL; | |
65 | else | |
66 | { | |
67 | strncpy(n, s, l); | |
68 | n[l] = 0; | |
69 | return n; | |
70 | } | |
71 | } | |
72 | ||
73 | char *dl_strdup(char *s) | |
74 | { | |
75 | return dl_strndup(s, (int)strlen(s)); | |
76 | } |