tlist.c - plan9port - [fork] Plan 9 from user space | |
git clone git://src.adamsgaard.dk/plan9port | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
tlist.c (1437B) | |
--- | |
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 } |