Blob


1 #include "sam.h"
3 /*
4 * Check that list has room for one more element.
5 */
6 static void
7 growlist(List *l, int esize)
8 {
9 uchar *p;
11 if(l->listptr == nil || l->nalloc == 0){
12 l->nalloc = INCR;
13 l->listptr = emalloc(INCR*esize);
14 l->nused = 0;
15 }
16 else if(l->nused == l->nalloc){
17 p = erealloc(l->listptr, (l->nalloc+INCR)*esize);
18 l->listptr = p;
19 memset(p+l->nalloc*esize, 0, INCR*esize);
20 l->nalloc += INCR;
21 }
22 }
24 /*
25 * Remove the ith element from the list
26 */
27 void
28 dellist(List *l, int i)
29 {
30 Posn *pp;
31 void **vpp;
33 l->nused--;
35 switch(l->type){
36 case 'P':
37 pp = l->posnptr+i;
38 memmove(pp, pp+1, (l->nused-i)*sizeof(*pp));
39 break;
40 case 'p':
41 vpp = l->voidpptr+i;
42 memmove(vpp, vpp+1, (l->nused-i)*sizeof(*vpp));
43 break;
44 }
45 }
47 /*
48 * Add a new element, whose position is i, to the list
49 */
50 void
51 inslist(List *l, int i, ...)
52 {
53 Posn *pp;
54 void **vpp;
55 va_list list;
58 va_start(list, i);
59 switch(l->type){
60 case 'P':
61 growlist(l, sizeof(*pp));
62 pp = l->posnptr+i;
63 memmove(pp+1, pp, (l->nused-i)*sizeof(*pp));
64 *pp = va_arg(list, Posn);
65 break;
66 case 'p':
67 growlist(l, sizeof(*vpp));
68 vpp = l->voidpptr+i;
69 memmove(vpp+1, vpp, (l->nused-i)*sizeof(*vpp));
70 *vpp = va_arg(list, void*);
71 break;
72 }
73 va_end(list);
75 l->nused++;
76 }
78 void
79 listfree(List *l)
80 {
81 free(l->listptr);
82 free(l);
83 }
85 List*
86 listalloc(int type)
87 {
88 List *l;
90 l = emalloc(sizeof(List));
91 l->type = type;
92 l->nalloc = 0;
93 l->nused = 0;
95 return l;
96 }