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