From b375fdbbbb9c18cc0da0ce9c15d9985e89a50d8f Mon Sep 17 00:00:00 2001 From: Kaz Kylheku Date: Tue, 20 Dec 2011 20:25:00 -0800 Subject: * eval.c (eval_init): New function registered. * lib.c (cat_vec): New function. * lib.h (cat_vec): Declared. * txr.1: Documentation stub. --- ChangeLog | 10 ++++++++++ eval.c | 1 + lib.c | 30 ++++++++++++++++++++++++++++++ lib.h | 1 + txr.1 | 2 ++ 5 files changed, 44 insertions(+) diff --git a/ChangeLog b/ChangeLog index c7941624..0fc73db7 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2011-12-20 Kaz Kylheku + + * 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 Bug #35137 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 -- cgit v1.2.3