summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2017-05-17 06:18:56 -0700
committerKaz Kylheku <kaz@kylheku.com>2017-05-17 06:18:56 -0700
commit37f31f6c8b88dc19c5a6afc8f1405cdbab8aad10 (patch)
treefb5ac8bec3b4c3eca78081467f9529a9dc5dca92
parent3508e350cd21400171a204e8aec02ef41acbbde9 (diff)
downloadtxr-37f31f6c8b88dc19c5a6afc8f1405cdbab8aad10.tar.gz
txr-37f31f6c8b88dc19c5a6afc8f1405cdbab8aad10.tar.bz2
txr-37f31f6c8b88dc19c5a6afc8f1405cdbab8aad10.zip
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.
-rw-r--r--ffi.c11
-rw-r--r--ffi.h1
2 files changed, 12 insertions, 0 deletions
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);