Introduction
Introduction Statistics Contact Development Disclaimer Help
list.c - 9base - revived minimalist port of Plan 9 userland to Unix
git clone git://git.suckless.org/9base
Log
Files
Refs
README
LICENSE
---
list.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 }
You are viewing proxied material from suckless.org. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.