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  }