]> git.neil.brown.name Git - TABS.git/blob - lib/dlink.c
Terminal Alocation and Booking System - June 2006
[TABS.git] / lib / dlink.c
1
2 /* doubly linked lists */
3
4 #include        <unistd.h>
5 #include        <stdlib.h>
6 #include        <string.h>
7 #include        "dlink.h"
8
9
10 void *dl_head(void)
11 {
12     void *h;
13     h = dl_alloc(0);
14     dl_next(h) = h;
15     dl_prev(h) = h;
16     return h;
17 }
18
19 void dl_free(void *v)
20 {
21     struct __dl_head *vv = v;
22     free(vv-1);
23 }
24
25
26 void dl_insert(void *head, void *val)
27 {
28     dl_next(val) = dl_next(head);
29     dl_prev(val) = head;
30     dl_next(dl_prev(val)) = val;
31     dl_prev(dl_next(val)) = val;
32 }
33
34 void dl_add(void *head, void *val)
35 {
36     dl_prev(val) = dl_prev(head);
37     dl_next(val) = head;
38     dl_next(dl_prev(val)) = val;
39     dl_prev(dl_next(val)) = val;
40 }
41
42 void dl_del(void *val)
43 {
44     if (dl_prev(val) == 0 || dl_next(val) == 0)
45         return;
46     dl_prev(dl_next(val)) = dl_prev(val);
47     dl_next(dl_prev(val)) = dl_next(val);
48     dl_prev(val) = dl_next(val) = 0;
49 }
50
51 char *dl_strndup(char *s, int l)
52 {
53     char *n;
54     if (s == NULL)
55         return NULL;
56     n = dl_newv(char, l+1);
57     if (n == NULL)
58         return NULL;
59     else
60     {
61         strncpy(n, s, l);
62         n[l] = 0;
63         return n;
64     }
65 }
66
67 char *dl_strdup(char *s)
68 {
69     return dl_strndup(s, strlen(s));
70 }