xref: /plan9/sys/src/cmd/sam/list.c (revision fe7781984ffc0fb4e6fe7bdd337c461cead20cdf)
13e12c5d1SDavid du Colombier #include "sam.h"
23e12c5d1SDavid du Colombier 
33e12c5d1SDavid du Colombier /*
43e12c5d1SDavid du Colombier  * Check that list has room for one more element.
53e12c5d1SDavid du Colombier  */
673e742d7SDavid du Colombier static void
growlist(List * l,int esize)773e742d7SDavid du Colombier growlist(List *l, int esize)
83e12c5d1SDavid du Colombier {
973e742d7SDavid du Colombier 	uchar *p;
1073e742d7SDavid du Colombier 
1173e742d7SDavid du Colombier 	if(l->listptr == nil || l->nalloc == 0){
123e12c5d1SDavid du Colombier 		l->nalloc = INCR;
1373e742d7SDavid du Colombier 		l->listptr = emalloc(INCR*esize);
143e12c5d1SDavid du Colombier 		l->nused = 0;
1573e742d7SDavid du Colombier 	}
1673e742d7SDavid du Colombier 	else if(l->nused == l->nalloc){
1773e742d7SDavid du Colombier 		p = erealloc(l->listptr, (l->nalloc+INCR)*esize);
1873e742d7SDavid du Colombier 		l->listptr = p;
19*fe778198SDavid du Colombier 		memset(p+l->nalloc*esize, 0, INCR*esize);
203e12c5d1SDavid du Colombier 		l->nalloc += INCR;
213e12c5d1SDavid du Colombier 	}
223e12c5d1SDavid du Colombier }
233e12c5d1SDavid du Colombier 
243e12c5d1SDavid du Colombier /*
253e12c5d1SDavid du Colombier  * Remove the ith element from the list
263e12c5d1SDavid du Colombier  */
273e12c5d1SDavid du Colombier void
dellist(List * l,int i)283e12c5d1SDavid du Colombier dellist(List *l, int i)
293e12c5d1SDavid du Colombier {
3073e742d7SDavid du Colombier 	Posn *pp;
3173e742d7SDavid du Colombier 	void **vpp;
3273e742d7SDavid du Colombier 
333e12c5d1SDavid du Colombier 	l->nused--;
3473e742d7SDavid du Colombier 
3573e742d7SDavid du Colombier 	switch(l->type){
3673e742d7SDavid du Colombier 	case 'P':
3773e742d7SDavid du Colombier 		pp = l->posnptr+i;
3873e742d7SDavid du Colombier 		memmove(pp, pp+1, (l->nused-i)*sizeof(*pp));
3973e742d7SDavid du Colombier 		break;
4073e742d7SDavid du Colombier 	case 'p':
4173e742d7SDavid du Colombier 		vpp = l->voidpptr+i;
4273e742d7SDavid du Colombier 		memmove(vpp, vpp+1, (l->nused-i)*sizeof(*vpp));
4373e742d7SDavid du Colombier 		break;
4473e742d7SDavid du Colombier 	}
453e12c5d1SDavid du Colombier }
463e12c5d1SDavid du Colombier 
473e12c5d1SDavid du Colombier /*
483e12c5d1SDavid du Colombier  * Add a new element, whose position is i, to the list
493e12c5d1SDavid du Colombier  */
503e12c5d1SDavid du Colombier void
inslist(List * l,int i,...)5173e742d7SDavid du Colombier inslist(List *l, int i, ...)
523e12c5d1SDavid du Colombier {
5373e742d7SDavid du Colombier 	Posn *pp;
5473e742d7SDavid du Colombier 	void **vpp;
5573e742d7SDavid du Colombier 	va_list list;
5673e742d7SDavid du Colombier 
5773e742d7SDavid du Colombier 
5873e742d7SDavid du Colombier 	va_start(list, i);
5973e742d7SDavid du Colombier 	switch(l->type){
6073e742d7SDavid du Colombier 	case 'P':
6173e742d7SDavid du Colombier 		growlist(l, sizeof(*pp));
6273e742d7SDavid du Colombier 		pp = l->posnptr+i;
6373e742d7SDavid du Colombier 		memmove(pp+1, pp, (l->nused-i)*sizeof(*pp));
6473e742d7SDavid du Colombier 		*pp = va_arg(list, Posn);
6573e742d7SDavid du Colombier 		break;
6673e742d7SDavid du Colombier 	case 'p':
6773e742d7SDavid du Colombier 		growlist(l, sizeof(*vpp));
6873e742d7SDavid du Colombier 		vpp = l->voidpptr+i;
6973e742d7SDavid du Colombier 		memmove(vpp+1, vpp, (l->nused-i)*sizeof(*vpp));
7073e742d7SDavid du Colombier 		*vpp = va_arg(list, void*);
7173e742d7SDavid du Colombier 		break;
7273e742d7SDavid du Colombier 	}
7373e742d7SDavid du Colombier 	va_end(list);
7473e742d7SDavid du Colombier 
753e12c5d1SDavid du Colombier 	l->nused++;
763e12c5d1SDavid du Colombier }
773e12c5d1SDavid du Colombier 
783e12c5d1SDavid du Colombier void
listfree(List * l)793e12c5d1SDavid du Colombier listfree(List *l)
803e12c5d1SDavid du Colombier {
813e12c5d1SDavid du Colombier 	free(l->listptr);
823e12c5d1SDavid du Colombier 	free(l);
833e12c5d1SDavid du Colombier }
8473e742d7SDavid du Colombier 
8573e742d7SDavid du Colombier List*
listalloc(int type)8673e742d7SDavid du Colombier listalloc(int type)
8773e742d7SDavid du Colombier {
8873e742d7SDavid du Colombier 	List *l;
8973e742d7SDavid du Colombier 
9073e742d7SDavid du Colombier 	l = emalloc(sizeof(List));
9173e742d7SDavid du Colombier 	l->type = type;
9273e742d7SDavid du Colombier 	l->nalloc = 0;
9373e742d7SDavid du Colombier 	l->nused = 0;
9473e742d7SDavid du Colombier 
9573e742d7SDavid du Colombier 	return l;
9673e742d7SDavid du Colombier }
97