From 37f31f6c8b88dc19c5a6afc8f1405cdbab8aad10 Mon Sep 17 00:00:00 2001 From: Kaz Kylheku Date: Wed, 17 May 2017 06:18:56 -0700 Subject: ffi: new carray_buf function. Treat a buffer through a carray view. * ffi.c (carray_buf): New function. (ffi_init): Register carray-buf intrinsic. * ffi.h (carray_buf): Declared. --- ffi.c | 11 +++++++++++ ffi.h | 1 + 2 files changed, 12 insertions(+) diff --git a/ffi.c b/ffi.c index b2631941..b2ce6441 100644 --- a/ffi.c +++ b/ffi.c @@ -2445,6 +2445,16 @@ val carray_blank(val nelem, val type) } } +val carray_buf(val buf, val type) +{ + val self = lit("carray-buf"); + cnum blen = c_num(length_buf(buf)); + mem_t *data = buf_get(buf, self); + struct txr_ffi_type *tft = ffi_type_struct(type); + cnum nelem = if3(tft->size, blen / tft->size, 0); + return make_carray(type, data, nelem, buf); +} + val vec_carray(val carray, val null_term_p) { val nt_p = default_null_arg(null_term_p); @@ -2573,6 +2583,7 @@ void ffi_init(void) reg_fun(intern(lit("length-carray"), user_package), func_n1(length_carray)); reg_fun(intern(lit("carray-vec"), user_package), func_n3o(carray_vec, 2)); reg_fun(intern(lit("carray-blank"), user_package), func_n2(carray_blank)); + reg_fun(intern(lit("carray-buf"), user_package), func_n2(carray_buf)); reg_fun(intern(lit("vec-carray"), user_package), func_n2o(vec_carray, 1)); reg_fun(intern(lit("list-carray"), user_package), func_n2o(list_carray, 1)); reg_fun(intern(lit("carray-ref"), user_package), func_n2(carray_ref)); diff --git a/ffi.h b/ffi.h index e9b188f2..31031e3f 100644 --- a/ffi.h +++ b/ffi.h @@ -73,6 +73,7 @@ val length_carray(val carray); mem_t *carray_get(val carray, val type, val self); val carray_vec(val vec, val type, val null_term_p); val carray_blank(val nelem, val type); +val carray_buf(val buf, val type); val vec_carray(val carray, val null_term_p); val list_carray(val carray, val null_term_p); val carray_ref(val carray, val idx); -- cgit v1.2.3