summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Llorens <lloda@sarc.name>2020-02-03 11:21:20 +0100
committerDaniel Llorens <lloda@sarc.name>2020-04-09 16:59:39 +0200
commit21ede682af731f6666ffe586a27f6572e00cdebb (patch)
tree6c450a53508c1b4eb30f6a51c3961bb04d448a13
parent2b4e45ca1b89a942200b7b9f46060dddc44d2876 (diff)
downloadguile-21ede682af731f6666ffe586a27f6572e00cdebb.tar.gz
Require vector as argument to vector-copy
* libguile/vectors.c: Require vector and simplify.
-rw-r--r--libguile/vectors.c22
1 files changed, 6 insertions, 16 deletions
diff --git a/libguile/vectors.c b/libguile/vectors.c
index 0f1e6085e..5d2eaf9a2 100644
--- a/libguile/vectors.c
+++ b/libguile/vectors.c
@@ -33,6 +33,7 @@
#include "numbers.h"
#include "pairs.h"
#include "vectors.h"
+#include <string.h>
#include "generalized-vectors.h"
@@ -269,22 +270,11 @@ SCM_DEFINE (scm_vector_copy, "vector-copy", 1, 0, 0,
"Return a copy of @var{vec}.")
#define FUNC_NAME s_scm_vector_copy
{
- scm_t_array_handle handle;
- size_t i, len;
- ssize_t inc;
- const SCM *src;
- SCM result, *dst;
-
- src = scm_vector_elements (vec, &handle, &len, &inc);
-
- result = make_vector (len);
- dst = SCM_I_VECTOR_WELTS (result);
- for (i = 0; i < len; i++, src += inc)
- dst[i] = *src;
-
- scm_array_handle_release (&handle);
-
- return result;
+ SCM_VALIDATE_VECTOR(1, vec);
+ size_t len = SCM_I_VECTOR_LENGTH (vec);
+ SCM val = make_vector (len);
+ memcpy (SCM_I_VECTOR_WELTS (val), SCM_I_VECTOR_ELTS (vec), len * sizeof(SCM));
+ return val;
}
#undef FUNC_NAME