summaryrefslogtreecommitdiff
path: root/libguile/generalized-vectors.c
diff options
context:
space:
mode:
authorAndy Wingo <wingo@pobox.com>2009-07-18 12:43:54 +0200
committerAndy Wingo <wingo@pobox.com>2009-07-19 15:15:44 +0200
commitf45eccffa73c043466a4cc0f5037132ee5795eee (patch)
tree16e441eddc02d5274cd61592814ea29bbe55b73d /libguile/generalized-vectors.c
parent476b894c71b436f3befb8af46b899aaf244763e2 (diff)
downloadguile-f45eccffa73c043466a4cc0f5037132ee5795eee.tar.gz
add registry of vector constructors, make-generalized-vector
* libguile/generalized-vectors.h: * libguile/generalized-vectors.c: Add a registry of vector constructors. (scm_make_generalized_vector): New public function, constructs a vector of a given type. * libguile/bitvectors.c: * libguile/bytevectors.c: * libguile/srfi-4.c: * libguile/strings.c: * libguile/vectors.c: Register vector constructors. * libguile/extensions.c (scm_init_extensions): No need to NULL the list of registered extensions here, the static init does it for us. Allows scm_c_register_extension to be called before scm_init_extensions. * libguile/init.c (scm_i_init_guile): Move array initialization earlier, so e.g. scm_init_strings has access to a valid list of array element types when registering its vector constructor.
Diffstat (limited to 'libguile/generalized-vectors.c')
-rw-r--r--libguile/generalized-vectors.c37
1 files changed, 37 insertions, 0 deletions
diff --git a/libguile/generalized-vectors.c b/libguile/generalized-vectors.c
index 0c85f368a..2d437a475 100644
--- a/libguile/generalized-vectors.c
+++ b/libguile/generalized-vectors.c
@@ -31,6 +31,43 @@
#include "libguile/generalized-vectors.h"
+struct scm_t_vector_ctor
+{
+ SCM tag;
+ SCM (*ctor)(SCM, SCM);
+};
+
+#define VECTOR_CTORS_N_STATIC_ALLOC 20
+static struct scm_t_vector_ctor vector_ctors[VECTOR_CTORS_N_STATIC_ALLOC];
+static int num_vector_ctors_registered = 0;
+
+void
+scm_i_register_vector_constructor (SCM type, SCM (*ctor)(SCM, SCM))
+{
+ if (num_vector_ctors_registered >= VECTOR_CTORS_N_STATIC_ALLOC)
+ /* need to increase VECTOR_CTORS_N_STATIC_ALLOC, buster */
+ abort ();
+ else
+ {
+ vector_ctors[num_vector_ctors_registered].tag = type;
+ vector_ctors[num_vector_ctors_registered].ctor = ctor;
+ num_vector_ctors_registered++;
+ }
+}
+
+SCM_DEFINE (scm_make_generalized_vector, "make-generalized-vector", 2, 1, 0,
+ (SCM type, SCM len, SCM fill),
+ "Make a generalized vector")
+#define FUNC_NAME s_scm_make_generalized_vector
+{
+ int i;
+ for (i = 0; i < num_vector_ctors_registered; i++)
+ if (vector_ctors[i].tag == type)
+ return vector_ctors[i].ctor(len, fill);
+ scm_wrong_type_arg_msg (FUNC_NAME, SCM_ARG1, type, "array type");
+}
+#undef FUNC_NAME
+
int
scm_is_generalized_vector (SCM obj)
{