diff options
| author | rsc <devnull@localhost> | 2006-04-20 20:49:00 +0000 |
|---|---|---|
| committer | rsc <devnull@localhost> | 2006-04-20 20:49:00 +0000 |
| commit | 2c0f3733ade43a38576aec82eced8768b42f9980 (patch) | |
| tree | 10ca21890107438f774b4a518e635cacd20f99e3 /src/cmd/sam/list.c | |
| parent | f8e39513f37e870d6be6aad7b5013b603f12cae8 (diff) | |
| download | plan9port-2c0f3733ade43a38576aec82eced8768b42f9980.tar.gz plan9port-2c0f3733ade43a38576aec82eced8768b42f9980.zip | |
64-bit fixes
Diffstat (limited to 'src/cmd/sam/list.c')
| -rw-r--r-- | src/cmd/sam/list.c | 73 |
1 files changed, 61 insertions, 12 deletions
diff --git a/src/cmd/sam/list.c b/src/cmd/sam/list.c index a8105425..d2e5d2dc 100644 --- a/src/cmd/sam/list.c +++ b/src/cmd/sam/list.c @@ -3,16 +3,20 @@ /* * Check that list has room for one more element. */ -void -growlist(List *l) +static void +growlist(List *l, int esize) { - if(l->listptr==0 || l->nalloc==0){ + uchar *p; + + if(l->listptr == nil || l->nalloc == 0){ l->nalloc = INCR; - l->listptr = emalloc(INCR*sizeof(long)); + l->listptr = emalloc(INCR*esize); l->nused = 0; - }else if(l->nused == l->nalloc){ - l->listptr = erealloc(l->listptr, (l->nalloc+INCR)*sizeof(long)); - memset((void*)(l->longptr+l->nalloc), 0, INCR*sizeof(long)); + } + else if(l->nused == l->nalloc){ + p = erealloc(l->listptr, (l->nalloc+INCR)*esize); + l->listptr = p; + memset(p+l->nalloc*esize, 0, INCR*esize); l->nalloc += INCR; } } @@ -23,19 +27,51 @@ growlist(List *l) void dellist(List *l, int i) { - memmove(&l->longptr[i], &l->longptr[i+1], (l->nused-(i+1))*sizeof(long)); + Posn *pp; + void **vpp; + l->nused--; + + switch(l->type){ + case 'P': + pp = l->posnptr+i; + memmove(pp, pp+1, (l->nused-i)*sizeof(*pp)); + break; + case 'p': + vpp = l->voidpptr+i; + memmove(vpp, vpp+1, (l->nused-i)*sizeof(*vpp)); + break; + } } /* * Add a new element, whose position is i, to the list */ void -inslist(List *l, int i, long val) +inslist(List *l, int i, ...) { - growlist(l); - memmove(&l->longptr[i+1], &l->longptr[i], (l->nused-i)*sizeof(long)); - l->longptr[i] = val; + Posn *pp; + void **vpp; + va_list list; + + + va_start(list, i); + switch(l->type){ + case 'P': + growlist(l, sizeof(*pp)); + pp = l->posnptr+i; + memmove(pp+1, pp, (l->nused-i)*sizeof(*pp)); + *pp = va_arg(list, Posn); + break; + case 'p': + growlist(l, sizeof(*vpp)); + vpp = l->voidpptr+i; + memmove(vpp+1, vpp, (l->nused-i)*sizeof(*vpp)); + *vpp = va_arg(list, void*); + break; + } + va_end(list); + l->nused++; } @@ -45,3 +81,16 @@ listfree(List *l) free(l->listptr); free(l); } + +List* +listalloc(int type) +{ + List *l; + + l = emalloc(sizeof(List)); + l->type = type; + l->nalloc = 0; + l->nused = 0; + + return l; +} |
