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 }