Subversion Repositories planix.SVN

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 - 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
}