Blame


1 76193d7c 2003-09-30 devnull #include "sam.h"
2 76193d7c 2003-09-30 devnull
3 76193d7c 2003-09-30 devnull /*
4 76193d7c 2003-09-30 devnull * Check that list has room for one more element.
5 76193d7c 2003-09-30 devnull */
6 2c0f3733 2006-04-20 devnull static void
7 2c0f3733 2006-04-20 devnull growlist(List *l, int esize)
8 76193d7c 2003-09-30 devnull {
9 2c0f3733 2006-04-20 devnull uchar *p;
10 2c0f3733 2006-04-20 devnull
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;
15 2c0f3733 2006-04-20 devnull }
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;
21 76193d7c 2003-09-30 devnull }
22 76193d7c 2003-09-30 devnull }
23 76193d7c 2003-09-30 devnull
24 76193d7c 2003-09-30 devnull /*
25 76193d7c 2003-09-30 devnull * Remove the ith element from the list
26 76193d7c 2003-09-30 devnull */
27 76193d7c 2003-09-30 devnull void
28 76193d7c 2003-09-30 devnull dellist(List *l, int i)
29 76193d7c 2003-09-30 devnull {
30 2c0f3733 2006-04-20 devnull Posn *pp;
31 2c0f3733 2006-04-20 devnull void **vpp;
32 2c0f3733 2006-04-20 devnull
33 76193d7c 2003-09-30 devnull l->nused--;
34 2c0f3733 2006-04-20 devnull
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));
39 2c0f3733 2006-04-20 devnull break;
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));
43 2c0f3733 2006-04-20 devnull break;
44 2c0f3733 2006-04-20 devnull }
45 76193d7c 2003-09-30 devnull }
46 76193d7c 2003-09-30 devnull
47 76193d7c 2003-09-30 devnull /*
48 76193d7c 2003-09-30 devnull * Add a new element, whose position is i, to the list
49 76193d7c 2003-09-30 devnull */
50 76193d7c 2003-09-30 devnull void
51 2c0f3733 2006-04-20 devnull inslist(List *l, int i, ...)
52 76193d7c 2003-09-30 devnull {
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;
56 2c0f3733 2006-04-20 devnull
57 2c0f3733 2006-04-20 devnull
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);
65 2c0f3733 2006-04-20 devnull break;
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*);
71 2c0f3733 2006-04-20 devnull break;
72 2c0f3733 2006-04-20 devnull }
73 2c0f3733 2006-04-20 devnull va_end(list);
74 2c0f3733 2006-04-20 devnull
75 76193d7c 2003-09-30 devnull l->nused++;
76 76193d7c 2003-09-30 devnull }
77 76193d7c 2003-09-30 devnull
78 76193d7c 2003-09-30 devnull void
79 76193d7c 2003-09-30 devnull listfree(List *l)
80 76193d7c 2003-09-30 devnull {
81 76193d7c 2003-09-30 devnull free(l->listptr);
82 76193d7c 2003-09-30 devnull free(l);
83 76193d7c 2003-09-30 devnull }
84 2c0f3733 2006-04-20 devnull
85 2c0f3733 2006-04-20 devnull List*
86 2c0f3733 2006-04-20 devnull listalloc(int type)
87 2c0f3733 2006-04-20 devnull {
88 2c0f3733 2006-04-20 devnull List *l;
89 2c0f3733 2006-04-20 devnull
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;
94 2c0f3733 2006-04-20 devnull
95 2c0f3733 2006-04-20 devnull return l;
96 2c0f3733 2006-04-20 devnull }