1 76193d7c 2003-09-30 devnull #include "sam.h"
4 76193d7c 2003-09-30 devnull * Check that list has room for one more element.
6 2c0f3733 2006-04-20 devnull static void
7 2c0f3733 2006-04-20 devnull growlist(List *l, int esize)
11 2c0f3733 2006-04-20 devnull if(l->listptr == nil || l->nalloc == 0){
12 76193d7c 2003-09-30 devnull l->nalloc = INCR;
13 2c0f3733 2006-04-20 devnull l->listptr = emalloc(INCR*esize);
14 76193d7c 2003-09-30 devnull l->nused = 0;
16 2c0f3733 2006-04-20 devnull else if(l->nused == l->nalloc){
17 2c0f3733 2006-04-20 devnull p = erealloc(l->listptr, (l->nalloc+INCR)*esize);
18 2c0f3733 2006-04-20 devnull l->listptr = p;
19 2c0f3733 2006-04-20 devnull memset(p+l->nalloc*esize, 0, INCR*esize);
20 76193d7c 2003-09-30 devnull l->nalloc += INCR;
25 76193d7c 2003-09-30 devnull * Remove the ith element from the list
28 76193d7c 2003-09-30 devnull dellist(List *l, int i)
30 2c0f3733 2006-04-20 devnull Posn *pp;
31 2c0f3733 2006-04-20 devnull void **vpp;
33 76193d7c 2003-09-30 devnull l->nused--;
35 2c0f3733 2006-04-20 devnull switch(l->type){
36 2c0f3733 2006-04-20 devnull case 'P':
37 2c0f3733 2006-04-20 devnull pp = l->posnptr+i;
38 2c0f3733 2006-04-20 devnull memmove(pp, pp+1, (l->nused-i)*sizeof(*pp));
40 2c0f3733 2006-04-20 devnull case 'p':
41 2c0f3733 2006-04-20 devnull vpp = l->voidpptr+i;
42 2c0f3733 2006-04-20 devnull memmove(vpp, vpp+1, (l->nused-i)*sizeof(*vpp));
48 76193d7c 2003-09-30 devnull * Add a new element, whose position is i, to the list
51 2c0f3733 2006-04-20 devnull inslist(List *l, int i, ...)
53 2c0f3733 2006-04-20 devnull Posn *pp;
54 2c0f3733 2006-04-20 devnull void **vpp;
55 2c0f3733 2006-04-20 devnull va_list list;
58 2c0f3733 2006-04-20 devnull va_start(list, i);
59 2c0f3733 2006-04-20 devnull switch(l->type){
60 2c0f3733 2006-04-20 devnull case 'P':
61 2c0f3733 2006-04-20 devnull growlist(l, sizeof(*pp));
62 2c0f3733 2006-04-20 devnull pp = l->posnptr+i;
63 2c0f3733 2006-04-20 devnull memmove(pp+1, pp, (l->nused-i)*sizeof(*pp));
64 2c0f3733 2006-04-20 devnull *pp = va_arg(list, Posn);
66 2c0f3733 2006-04-20 devnull case 'p':
67 2c0f3733 2006-04-20 devnull growlist(l, sizeof(*vpp));
68 2c0f3733 2006-04-20 devnull vpp = l->voidpptr+i;
69 2c0f3733 2006-04-20 devnull memmove(vpp+1, vpp, (l->nused-i)*sizeof(*vpp));
70 2c0f3733 2006-04-20 devnull *vpp = va_arg(list, void*);
73 2c0f3733 2006-04-20 devnull va_end(list);
75 76193d7c 2003-09-30 devnull l->nused++;
79 76193d7c 2003-09-30 devnull listfree(List *l)
81 76193d7c 2003-09-30 devnull free(l->listptr);
86 2c0f3733 2006-04-20 devnull listalloc(int type)
90 2c0f3733 2006-04-20 devnull l = emalloc(sizeof(List));
91 2c0f3733 2006-04-20 devnull l->type = type;
92 2c0f3733 2006-04-20 devnull l->nalloc = 0;
93 2c0f3733 2006-04-20 devnull l->nused = 0;
95 2c0f3733 2006-04-20 devnull return l;