diff options
author | Daniel Llorens <lloda@sarc.name> | 2020-02-05 15:55:19 +0100 |
---|---|---|
committer | Daniel Llorens <lloda@sarc.name> | 2020-04-09 16:59:39 +0200 |
commit | dbf08c3a96ee59af7bc9fc6454c6941ee08cda11 (patch) | |
tree | a879e6978f2486cf223bf171f00d69a78db3d9d1 | |
parent | bf5b9a86bcd23711cf9cf6a5ddbdf2175eea3463 (diff) | |
download | guile-dbf08c3a96ee59af7bc9fc6454c6941ee08cda11.tar.gz |
Add lenp parameter back to scm_bitvector_(writable_)elements
-rw-r--r-- | NEWS-wip-vector-cleanup.txt | 4 | ||||
-rw-r--r-- | doc/ref/api-data.texi | 4 | ||||
-rw-r--r-- | libguile/bitvectors.c | 22 | ||||
-rw-r--r-- | libguile/bitvectors.h | 4 |
4 files changed, 20 insertions, 14 deletions
diff --git a/NEWS-wip-vector-cleanup.txt b/NEWS-wip-vector-cleanup.txt index 8edd5bb80..1eb40ffe7 100644 --- a/NEWS-wip-vector-cleanup.txt +++ b/NEWS-wip-vector-cleanup.txt @@ -34,11 +34,11 @@ Use SCM_VECTOR_REF, SCM_VECTOR_SET and SCM_VECTOR_LENGTH instead. ** The vector argument to scm_vector_elements / scm_vector_writable_elements must be a true vector. Handle/inc arguments have been removed. -Use scm_array_get_handle and scm_array_handle_elements / scm_array_handle_writable_elements on general arrays. +Use scm_array_get_handle and scm_array_handle_elements / scm_array_handle_writable_elements on general #t arrays. ** The vector argument to scm_bitvector_elements / scm_bitvector_writable_elements must be a true bitvector. Handle/inc arguments have been removed. -Use scm_array_get_handle and scm_array_handle_bit_elements / scm_array_handle_bit_writable_elements on bit arrays. +Use scm_array_get_handle and scm_array_handle_bit_elements / scm_array_handle_bit_writable_elements on general bit arrays. Use scm_array1_bit_elements (NEW) / scm_array1_bit_writable_elements (NEW) on rank-1 bit arrays. diff --git a/doc/ref/api-data.texi b/doc/ref/api-data.texi index a764188ea..010d4c841 100644 --- a/doc/ref/api-data.texi +++ b/doc/ref/api-data.texi @@ -6663,13 +6663,13 @@ For example, @end example @end deffn -@deftypefn {C Function} {const scm_t_uint32 *} scm_bitvector_elements (SCM vec) +@deftypefn {C Function} {const scm_t_uint32 *} scm_bitvector_elements (SCM vec, size_t *lenp) Like @code{scm_vector_elements} (@pxref{Vector Accessing from C}), but for bitvectors. See @code{scm_array_handle_bit_elements} for how to use the returned pointer. @end deftypefn -@deftypefn {C Function} {scm_t_uint32 *} scm_bitvector_writable_elements (SCM vec) +@deftypefn {C Function} {scm_t_uint32 *} scm_bitvector_writable_elements (SCM vec, size_t *lenp) Like @code{scm_bitvector_elements}, but the pointer is good for reading and writing. @end deftypefn diff --git a/libguile/bitvectors.c b/libguile/bitvectors.c index f3d4cf2fa..2b41f6d6b 100644 --- a/libguile/bitvectors.c +++ b/libguile/bitvectors.c @@ -218,16 +218,20 @@ scm_array_handle_bit_elements_offset (scm_t_array_handle *h) } while (0) const uint32_t * -scm_bitvector_elements (SCM vec) +scm_bitvector_elements (SCM vec, size_t *lenp) { SCM_VALIDATE_BITVECTOR (1, vec); + if (lenp) + *lenp = BITVECTOR_LENGTH (vec); return BITVECTOR_BITS (vec); } uint32_t * -scm_bitvector_writable_elements (SCM vec) +scm_bitvector_writable_elements (SCM vec, size_t *lenp) { SCM_VALIDATE_MUTABLE_BITVECTOR (1, vec); + if (lenp) + *lenp = BITVECTOR_LENGTH (vec); return BITVECTOR_BITS (vec); } @@ -250,8 +254,9 @@ bitset_ (uint32_t *bits, size_t idx, bool b) SCM scm_c_bitvector_ref (SCM vec, size_t idx) { - const uint32_t *bits = scm_bitvector_elements (vec); - if (idx >= BITVECTOR_LENGTH (vec)) + size_t len; + const uint32_t *bits = scm_bitvector_elements (vec, &len); + if (idx >= len) scm_out_of_range (NULL, scm_from_size_t (idx)); return scm_from_bool (bitref_(bits, idx)); } @@ -269,8 +274,9 @@ SCM_DEFINE (scm_bitvector_ref, "bitvector-ref", 2, 0, 0, void scm_c_bitvector_set_x (SCM vec, size_t idx, SCM val) { - uint32_t *bits = scm_bitvector_writable_elements (vec); - if (idx >= BITVECTOR_LENGTH (vec)) + size_t len; + uint32_t *bits = scm_bitvector_writable_elements (vec, &len); + if (idx >= len) scm_out_of_range (NULL, scm_from_size_t (idx)); bitset_(bits, idx, scm_is_true (val)); @@ -335,7 +341,7 @@ SCM_DEFINE (scm_list_to_bitvector, "list->bitvector", 1, 0, 0, size_t bit_len = scm_to_size_t (scm_length (list)); SCM vec = scm_c_make_bitvector (bit_len, SCM_UNDEFINED); size_t word_len = (bit_len+31)/32; - uint32_t *bits = scm_bitvector_writable_elements (vec); + uint32_t *bits = scm_bitvector_writable_elements (vec, NULL); size_t i, j; for (i = 0; i < word_len && scm_is_pair (list); i++, bit_len -= 32) @@ -745,7 +751,7 @@ scm_istr2bve (SCM str) const char *c_str; uint32_t *data; - data = scm_bitvector_writable_elements (vec); + data = scm_bitvector_writable_elements (vec, NULL); c_str = scm_i_string_chars (str); for (k = 0; k < (len + 31) / 32; k++) diff --git a/libguile/bitvectors.h b/libguile/bitvectors.h index 826390786..1c5b7dfcc 100644 --- a/libguile/bitvectors.h +++ b/libguile/bitvectors.h @@ -57,8 +57,8 @@ SCM_API void scm_c_bitvector_set_x (SCM vec, size_t idx, SCM val); SCM_API const uint32_t *scm_array_handle_bit_elements (scm_t_array_handle *h); SCM_API uint32_t *scm_array_handle_bit_writable_elements (scm_t_array_handle *h); SCM_API size_t scm_array_handle_bit_elements_offset (scm_t_array_handle *h); -SCM_API const uint32_t *scm_bitvector_elements (SCM vec); -SCM_API uint32_t *scm_bitvector_writable_elements (SCM vec); +SCM_API const uint32_t *scm_bitvector_elements (SCM vec, size_t *lenp); +SCM_API uint32_t *scm_bitvector_writable_elements (SCM vec, size_t *lenp); SCM_INTERNAL uint32_t *scm_i_bitvector_bits (SCM vec); SCM_INTERNAL int scm_i_is_mutable_bitvector (SCM vec); |