diff options
Diffstat (limited to 'src/cmd/gc/bv.c')
-rw-r--r-- | src/cmd/gc/bv.c | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/src/cmd/gc/bv.c b/src/cmd/gc/bv.c new file mode 100644 index 000000000..92834a97b --- /dev/null +++ b/src/cmd/gc/bv.c @@ -0,0 +1,80 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include <u.h> +#include <libc.h> +#include "go.h" + +enum { + WORDSIZE = sizeof(uint32), + WORDBITS = 32, +}; + +uintptr +bvsize(uintptr n) +{ + return ((n + WORDBITS - 1) / WORDBITS) * WORDSIZE; +} + +Bvec* +bvalloc(int32 n) +{ + Bvec *bv; + uintptr nbytes; + + if(n < 0) + fatal("bvalloc: initial size is negative\n"); + nbytes = sizeof(Bvec) + bvsize(n); + bv = malloc(nbytes); + if(bv == nil) + fatal("bvalloc: malloc failed\n"); + memset(bv, 0, nbytes); + bv->n = n; + return bv; +} + +void +bvset(Bvec *bv, int32 i) +{ + uint32 mask; + + if(i < 0 || i >= bv->n) + fatal("bvset: index %d is out of bounds with length %d\n", i, bv->n); + mask = 1U << (i % WORDBITS); + bv->b[i / WORDBITS] |= mask; +} + +void +bvres(Bvec *bv, int32 i) +{ + uint32 mask; + + if(i < 0 || i >= bv->n) + fatal("bvres: index %d is out of bounds with length %d\n", i, bv->n); + mask = ~(1 << (i % WORDBITS)); + bv->b[i / WORDBITS] &= mask; +} + +int +bvget(Bvec *bv, int32 i) +{ + uint32 mask, word; + + if(i < 0 || i >= bv->n) + fatal("bvget: index %d is out of bounds with length %d\n", i, bv->n); + mask = 1 << (i % WORDBITS); + word = bv->b[i / WORDBITS] & mask; + return word ? 1 : 0; +} + +int +bvisempty(Bvec *bv) +{ + int32 i; + + for(i = 0; i < bv->n; i += WORDBITS) + if(bv->b[i / WORDBITS] != 0) + return 0; + return 1; +} |