summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog10
-rw-r--r--eval.c1
-rw-r--r--lib.c30
-rw-r--r--lib.h1
-rw-r--r--txr.12
5 files changed, 44 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
index c7941624..0fc73db7 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,15 @@
2011-12-20 Kaz Kylheku <kaz@kylheku.com>
+ * eval.c (eval_init): New function registered.
+
+ * lib.c (cat_vec): New function.
+
+ * lib.h (cat_vec): Declared.
+
+ * txr.1: Documentation stub.
+
+2011-12-20 Kaz Kylheku <kaz@kylheku.com>
+
Bug #35137
* unwind.c (uw_unwind_to_exit_point): When jumping to a catch frame,
diff --git a/eval.c b/eval.c
index e7475f9b..8f8ed0aa 100644
--- a/eval.c
+++ b/eval.c
@@ -1387,6 +1387,7 @@ void eval_init(void)
reg_fun(intern(lit("list-vector"), user_package), func_n1(list_vector));
reg_fun(intern(lit("copy-vec"), user_package), func_n1(copy_vec));
reg_fun(intern(lit("sub-vec"), user_package), func_n3(sub_vec));
+ reg_fun(intern(lit("cat-vec"), user_package), func_n1(cat_vec));
reg_fun(intern(lit("assoc"), user_package), func_n2(assoc));
reg_fun(intern(lit("assq"), user_package), func_n2(assq));
diff --git a/lib.c b/lib.c
index 476e9353..3cf9113d 100644
--- a/lib.c
+++ b/lib.c
@@ -2453,6 +2453,36 @@ val sub_vec(val vec_in, val from, val to)
}
}
+val cat_vec(val list)
+{
+ cnum total = 0;
+ val iter;
+ val vec, *v;
+
+ for (iter = list; iter != nil; iter = cdr(iter))
+ total += c_num(length_vec(car(iter)));
+
+ vec = make_obj();
+ v = (val *) chk_malloc((total + 2) * sizeof *v);
+
+#ifdef HAVE_VALGRIND
+ vec->v.vec_true_start = v;
+#endif
+ v += 2;
+ vec->v.type = VEC;
+ vec->v.vec = v;
+ v[vec_length] = v[vec_alloc] = num(total);
+
+ for (iter = list; iter != nil; iter = cdr(iter)) {
+ val item = car(iter);
+ cnum len = c_num(item->v.vec[vec_length]);
+ memcpy(v, item->v.vec, len * sizeof *v);
+ v += len;
+ }
+
+ return vec;
+}
+
static val lazy_stream_func(val env, val lcons)
{
val stream = car(env);
diff --git a/lib.h b/lib.h
index 9224d17b..ba090269 100644
--- a/lib.h
+++ b/lib.h
@@ -505,6 +505,7 @@ val vector_list(val list);
val list_vector(val vector);
val copy_vec(val vec);
val sub_vec(val vec_in, val from, val to);
+val cat_vec(val list);
val lazy_stream_cons(val stream);
val lazy_str(val list, val term, val limit);
val lazy_str_force_upto(val lstr, val index);
diff --git a/txr.1 b/txr.1
index 456a665e..e064eed5 100644
--- a/txr.1
+++ b/txr.1
@@ -5668,6 +5668,8 @@ yields (1 2 3 4 5). In TXR Lisp, this usage can be simulated using
.SS Function sub-vec
+.SS Function cat-vec
+
.SS Function assoc
.SS Function assq