]> git.lizzy.rs Git - plan9front.git/blob - sys/src/cmd/sam/list.c
cc: use 7 octal digits for 21 bit runes
[plan9front.git] / sys / src / cmd / sam / list.c
1 #include "sam.h"
2
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;
10
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 }
23
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;
32
33         l->nused--;
34
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 }
46
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;
56
57
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);
74
75         l->nused++;
76 }
77
78 void
79 listfree(List *l)
80 {
81         free(l->listptr);
82         free(l);
83 }
84
85 List*
86 listalloc(int type)
87 {
88         List *l;
89
90         l = emalloc(sizeof(List));
91         l->type = type;
92         l->nalloc = 0;
93         l->nused = 0;
94
95         return l;
96 }