1: /*
2: ** Routines for fiddlin' linked lists
3: ** Erik E. Fair <fair@ucbarpa.berkeley.edu>
4: */
5:
6: #include <sys/types.h>
7: #include "llist.h"
8:
9: extern free();
10: extern caddr_t malloc();
11:
12: /*
13: ** a little wasteful for some cases, but it works, and I don't mind
14: ** the extra padding - think of it as insurance.
15: */
16: #define ALIGN(x) ((x) + (sizeof(long) - (x) % sizeof(long)))
17:
18: /*
19: ** recursively free a linked list
20: */
21: void
22: l_free(lp)
23: register ll_t *lp;
24: {
25: if (lp->l_next == (ll_t *)NULL)
26: return;
27: l_free(lp->l_next);
28: (void) free(lp->l_item);
29: }
30:
31: /*
32: ** allocate a new element in a linked list, along with enough space
33: ** at the end of the item for the next list element header.
34: */
35: ll_t *
36: l_alloc(lp, s, len)
37: register ll_t *lp;
38: caddr_t s;
39: register int len;
40: {
41: if (s == (caddr_t)NULL || lp == (ll_t *)NULL || len <= 0)
42: return((ll_t *)NULL);
43:
44: lp->l_len = len;
45: len = ALIGN(len);
46:
47: if ((lp->l_item = malloc((unsigned)len + sizeof(ll_t))) == (caddr_t)NULL)
48: return((ll_t *)NULL);
49:
50: bcopy(s, lp->l_item, lp->l_len);
51: lp->l_next = (ll_t *)(&lp->l_item[len]);
52:
53: /*
54: ** set up next list entry
55: */
56: lp = lp->l_next;
57: lp->l_next = (ll_t *)NULL;
58: lp->l_item = (caddr_t)NULL;
59: lp->l_len = 0;
60: return(lp);
61: }
Defined functions
Defined macros
ALIGN
defined in line
16; used 1 times