From ff2451f94e6a4c908561d6d15d68b2f882278356 Mon Sep 17 00:00:00 2001 From: Kaz Kylheku Date: Thu, 15 Jun 2017 06:58:43 -0700 Subject: 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. --- ffi.c | 26 ++++++++++++++++++++++++++ ffi.h | 2 ++ txr.1 | 39 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 67 insertions(+) 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(); diff --git a/ffi.h b/ffi.h index 82e9ef4b..984d97ee 100644 --- a/ffi.h +++ b/ffi.h @@ -116,4 +116,6 @@ val carray_unum(val num, val type); val carray_num(val num, val type); val unum_carray(val carray); val num_carray(val carray); +val put_carray(val carray, val offs, val stream); +val fill_carray(val carray, val offs, val stream); void ffi_init(void); diff --git a/txr.1 b/txr.1 index 3e3e1e00..db723a7a 100644 --- a/txr.1 +++ b/txr.1 @@ -57175,6 +57175,45 @@ of the bytes are .codn #xFF , the value -1 is returned. +.coNP Functions @ fill-carray and @ put-carray +.synb +.mets (fill-array < carray >> [ pos <> [ stream ]]) +.mets (put-array < carray >> [ pos <> [ stream ]]) +.syne +.desc +The +.code fill-array +and +.code put-array +functions perform stream output using the +.code carray +object as a buffer. + +The semantics of these functions is as follows. +A temporary buffer is created which aliases the storage of +.meta carray +and this buffer is used as an argument in an invocation of, respectively, +the buffer I/O function +.meta fill-buf +or +.metn put-buf . + +The value returned by buffer I/O function is returned. + +The +.meta pos +and +.meta stream +arguments are defaulted exactly in the same manner as by +.code fill-buf +and +.codn put-buf , +and have the same meaning. In particular, +.meta pos +indicates a byte offset into the +.meta carray +object's storage, not an array index. + .SH* INTERACTIVE LISTENER .SS* Overview -- cgit v1.2.3