diff options
author | Andy Wingo <wingo@pobox.com> | 2011-11-10 22:30:02 +0100 |
---|---|---|
committer | Andy Wingo <wingo@pobox.com> | 2011-11-10 22:30:02 +0100 |
commit | 39c5363b4fbd32f1c895e8fa8b0c8dd067907947 (patch) | |
tree | 8e71b8d20e933308180cf17755397c1fb3880b9d | |
parent | fb135e12a473fd9a1612a59f904cfb90877fe775 (diff) | |
download | guile-39c5363b4fbd32f1c895e8fa8b0c8dd067907947.tar.gz |
fix bit-set*! bug (!)
* libguile/bitvectors.c (scm_bit_set_star_x): Fix a long-standing (since
2005) bug in which instead of using the kv bitvector, we actually use
the `v' bitvector. Also, change to allow `kv' being shorter than
`v'.
* test-suite/tests/bitvectors.test ("bit-set*!"): Add tests.
-rw-r--r-- | libguile/bitvectors.c | 8 | ||||
-rw-r--r-- | test-suite/tests/bitvectors.test | 21 |
2 files changed, 22 insertions, 7 deletions
diff --git a/libguile/bitvectors.c b/libguile/bitvectors.c index 17b026009..c569ebfe1 100644 --- a/libguile/bitvectors.c +++ b/libguile/bitvectors.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1995,1996,1997,1998,2000,2001,2002,2003,2004, 2005, 2006, 2009, 2010 Free Software Foundation, Inc. +/* Copyright (C) 1995,1996,1997,1998,2000,2001,2002,2003,2004, 2005, 2006, 2009, 2010, 2011 Free Software Foundation, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -568,7 +568,7 @@ SCM_DEFINE (scm_bit_set_star_x, "bit-set*!", 3, 0, 0, "\n" "If @var{kv} is a bit vector, then those entries where it has\n" "@code{#t} are the ones in @var{v} which are set to @var{obj}.\n" - "@var{kv} and @var{v} must be the same length. When @var{obj}\n" + "@var{v} must be at least as long as @var{kv}. When @var{obj}\n" "is @code{#t} it's like @var{kv} is OR'ed into @var{v}. Or when\n" "@var{obj} is @code{#f} it can be seen as an ANDNOT.\n" "\n" @@ -611,10 +611,10 @@ SCM_DEFINE (scm_bit_set_star_x, "bit-set*!", 3, 0, 0, ssize_t kv_inc; const scm_t_uint32 *kv_bits; - kv_bits = scm_bitvector_elements (v, &kv_handle, + kv_bits = scm_bitvector_elements (kv, &kv_handle, &kv_off, &kv_len, &kv_inc); - if (v_len != kv_len) + if (v_len < kv_len) scm_misc_error (NULL, "bit vectors must have equal length", SCM_EOL); diff --git a/test-suite/tests/bitvectors.test b/test-suite/tests/bitvectors.test index 9833b3bfd..c16fb4d49 100644 --- a/test-suite/tests/bitvectors.test +++ b/test-suite/tests/bitvectors.test @@ -1,6 +1,6 @@ ;;;; bitvectors.test --- tests guile's bitvectors -*- scheme -*- ;;;; -;;;; Copyright 2010 Free Software Foundation, Inc. +;;;; Copyright 2010, 2011 Free Software Foundation, Inc. ;;;; ;;;; This library is free software; you can redistribute it and/or ;;;; modify it under the terms of the GNU Lesser General Public @@ -55,5 +55,20 @@ (uniform-vector-set! bv 0 #t) (pass-if (eqv? (uniform-vector-ref bv 0) #t))))) - - +(with-test-prefix "bit-set*!" + (pass-if "#t" + (let ((v (bitvector #t #t #f #f))) + (bit-set*! v #*1010 #t) + (equal? v #*1110))) + (pass-if "#f" + (let ((v (bitvector #t #t #f #f))) + (bit-set*! v #*1010 #f) + (equal? v #*0100))) + (pass-if "#t, shorter" + (let ((v (bitvector #t #t #f #f))) + (bit-set*! v #*101 #t) + (equal? v #*1110))) + (pass-if "#f, shorter" + (let ((v (bitvector #t #t #f #f))) + (bit-set*! v #*101 #f) + (equal? v #*0100)))) |