9fans.net/go@v0.0.7/cmd/sam/list.go (about) 1 // #include "sam.h" 2 3 // +build ignore 4 5 package main 6 7 /* 8 * Check that list has room for one more element. 9 */ 10 func growlist(l *List, esize int) { 11 if l.listptr == nil || l.nalloc == 0 { 12 l.nalloc = INCR 13 l.listptr = emalloc(INCR * esize) 14 l.nused = 0 15 } else if l.nused == l.nalloc { 16 p := erealloc(l.listptr, (l.nalloc+INCR)*esize) 17 l.listptr = p 18 memset(p+l.nalloc*esize, 0, INCR*esize) 19 l.nalloc += INCR 20 } 21 } 22 23 /* 24 * Remove the ith element from the list 25 */ 26 func dellist(l *List, i int) { 27 l.nused-- 28 var pp *Posn 29 var vpp **[0]byte 30 31 switch l.type_ { 32 case 'P': 33 pp = l.posnptr + i 34 memmove(pp, pp+1, (l.nused-i)*sizeof(*pp)) 35 case 'p': 36 vpp = l.voidpptr + i 37 memmove(vpp, vpp+1, (l.nused-i)*sizeof(*vpp)) 38 } 39 } 40 41 /* 42 * Add a new element, whose position is i, to the list 43 */ 44 func inslist(l *List, i int, args ...interface{}) { 45 var list va_list 46 47 va_start(list, i) 48 var pp *Posn 49 var vpp **[0]byte 50 switch l.type_ { 51 case 'P': 52 growlist(l, sizeof(*pp)) 53 pp = l.posnptr + i 54 memmove(pp+1, pp, (l.nused-i)*sizeof(*pp)) 55 *pp = va_arg(list, Posn) 56 case 'p': 57 growlist(l, sizeof(*vpp)) 58 vpp = l.voidpptr + i 59 memmove(vpp+1, vpp, (l.nused-i)*sizeof(*vpp)) 60 *vpp = va_arg(list, *[0]byte) 61 } 62 va_end(list) 63 64 l.nused++ 65 } 66 67 func listfree(l *List) { 68 free(l.listptr) 69 free(l) 70 } 71 72 func listalloc(type_ int) *List { 73 l := emalloc(sizeof(List)) 74 l.type_ = type_ 75 l.nalloc = 0 76 l.nused = 0 77 78 return l 79 }