diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2017-06-15 06:58:43 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2017-06-15 06:58:43 -0700 |
commit | e227120527ab35fa9a8c5356296bb799f62d0c86 (patch) | |
tree | 61865398b048b67defaa1cfad71667327e4e8a9f /ffi.c | |
parent | 013f02eb6ddcf08e4ffaf0cf5fb11fd078ca484a (diff) | |
download | txr-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.c | 26 |
1 files changed, 26 insertions, 0 deletions
@@ -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(); |