summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2019-06-13 07:27:22 -0700
committerKaz Kylheku <kaz@kylheku.com>2019-06-13 07:27:22 -0700
commit9a275d84effb81f25f409d9bcb95726173018b68 (patch)
tree9cb213d7f193c68557612c9c06d3846616753a76
parent8f72f80a49eeefc27d6790acec0d706d3852ed04 (diff)
downloadtxr-9a275d84effb81f25f409d9bcb95726173018b68.tar.gz
txr-9a275d84effb81f25f409d9bcb95726173018b68.tar.bz2
txr-9a275d84effb81f25f409d9bcb95726173018b68.zip
carray-replace: missing functionality.
* ffi.c (carray_replace): add missing index list assignment semantics required by documentation.
-rw-r--r--ffi.c31
1 files changed, 24 insertions, 7 deletions
diff --git a/ffi.c b/ffi.c
index f8d7b566..e2900d4d 100644
--- a/ffi.c
+++ b/ffi.c
@@ -4891,21 +4891,38 @@ val carray_replace(val carray, val values, val from, val to)
struct carray *scry = carray_struct_checked(self, carray);
cnum ln = scry->nelem;
val len = num(ln);
- val vlen = length(values);
- if (null_or_missing_p(from))
+ if (null_or_missing_p(from)) {
from = zero;
+ } else if (!integerp(from)) {
+ seq_iter_t wh_iter, item_iter;
+ val wh, item;
+ seq_iter_init(self, &wh_iter, from);
+ seq_iter_init(self, &item_iter, values);
- if (null_or_missing_p(to))
- to = len;
+ if (!missingp(to))
+ uw_throwf(error_s,
+ lit("~a: to-arg not applicable when from-arg is a list"),
+ self, nao);
- if (minusp(to))
- to = plus(to, len);
+ while (seq_get(&wh_iter, &wh) && seq_get(&item_iter, &item)) {
+ if (ge(wh, len))
+ break;
+ carray_refset(carray, wh, item);
+ }
- if (minusp(from))
+ return carray;
+ } else if (minusp(from)) {
from = plus(from, len);
+ }
+
+ if (null_or_missing_p(to))
+ to = len;
+ else if (minusp(to))
+ to = plus(to, len);
{
+ val vlen = length(values);
cnum fn = c_num(from);
cnum tn = c_num(to);
struct txr_ffi_type *eltft = scry->eltft;