summaryrefslogtreecommitdiffstats
path: root/ffi.c
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2017-06-15 06:58:43 -0700
committerKaz Kylheku <kaz@kylheku.com>2017-06-15 06:58:43 -0700
commite227120527ab35fa9a8c5356296bb799f62d0c86 (patch)
tree61865398b048b67defaa1cfad71667327e4e8a9f /ffi.c
parent013f02eb6ddcf08e4ffaf0cf5fb11fd078ca484a (diff)
downloadtxr-e227120527ab35fa9a8c5356296bb799f62d0c86.tar.gz
txr-e227120527ab35fa9a8c5356296bb799f62d0c86.tar.bz2
txr-e227120527ab35fa9a8c5356296bb799f62d0c86.zip
ffi: new put-carray and fill-carray functions.
* ffi.c (put_carray, fill_carray): New functions. (ffi_init): put-carray and fill-carray intrinsics registered. * ffi.h (put_carray, fill_carray): Declared. * txr.1: Documented.
Diffstat (limited to 'ffi.c')
-rw-r--r--ffi.c26
1 files changed, 26 insertions, 0 deletions
diff --git a/ffi.c b/ffi.c
index fc73a65d..47155ec2 100644
--- a/ffi.c
+++ b/ffi.c
@@ -4899,6 +4899,30 @@ val num_carray(val carray)
return sign_extend(normalize(ubn), unum(bits));
}
+val put_carray(val carray, val offs, val stream)
+{
+ struct carray *scry = carray_struct_checked(carray);
+ struct txr_ffi_type *etft = scry->eltft;
+ ucnum size = (ucnum) etft->size * (ucnum) scry->nelem;
+ val buf = make_borrowed_buf(unum(size), scry->data);
+ val pos = default_arg(offs, zero);
+ val ret = put_buf(buf, pos, stream);
+ gc_hint(carray);
+ return ret;
+}
+
+val fill_carray(val carray, val offs, val stream)
+{
+ struct carray *scry = carray_struct_checked(carray);
+ struct txr_ffi_type *etft = scry->eltft;
+ ucnum size = (ucnum) etft->size * (ucnum) scry->nelem;
+ val buf = make_borrowed_buf(unum(size), scry->data);
+ val pos = default_arg(offs, zero);
+ val ret = fill_buf(buf, pos, stream);
+ gc_hint(carray);
+ return ret;
+}
+
void ffi_init(void)
{
prot1(&ffi_typedef_hash);
@@ -5011,6 +5035,8 @@ void ffi_init(void)
reg_fun(intern(lit("carray-num"), user_package), func_n2o(carray_num, 1));
reg_fun(intern(lit("unum-carray"), user_package), func_n1(unum_carray));
reg_fun(intern(lit("num-carray"), user_package), func_n1(num_carray));
+ reg_fun(intern(lit("put-carray"), user_package), func_n3o(put_carray, 1));
+ reg_fun(intern(lit("fill-carray"), user_package), func_n3o(fill_carray, 1));
ffi_typedef_hash = make_hash(nil, nil, nil);
ffi_init_types();
ffi_init_extra_types();