summaryrefslogtreecommitdiffstats
path: root/lib.c
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2016-09-14 06:08:09 -0700
committerKaz Kylheku <kaz@kylheku.com>2016-09-14 06:08:09 -0700
commit5e79435c47c6d25310be92b412abed8670e5a8ff (patch)
tree02366dc8b5443bd02e8e9a44602833aaf0bbec24 /lib.c
parent8e1a3e36d17788a59903db7ea865bbac8553b56a (diff)
downloadtxr-5e79435c47c6d25310be92b412abed8670e5a8ff.tar.gz
txr-5e79435c47c6d25310be92b412abed8670e5a8ff.tar.bz2
txr-5e79435c47c6d25310be92b412abed8670e5a8ff.zip
Fix broken keep/remove functions.
* lib.c (remq, remql, remqual, remove_if, keep_if): Bug: functions don't work correctly for strings. Anyway, the ldiff-based algorithm is ugly on vectors and strings. Patching things upp by converting input to list with tolist.
Diffstat (limited to 'lib.c')
-rw-r--r--lib.c29
1 files changed, 10 insertions, 19 deletions
diff --git a/lib.c b/lib.c
index 5ca640c5..1ed27766 100644
--- a/lib.c
+++ b/lib.c
@@ -1476,13 +1476,12 @@ val rmember_if(val pred, val list, val key)
return found;
}
-val remq(val obj, val list)
+val remq(val obj, val list_orig)
{
list_collect_decl (out, ptail);
- val list_orig = list;
+ val list = tolist(list_orig);
val lastmatch = cons(nil, list);
- list = nullify(list);
gc_hint(list);
@@ -1496,14 +1495,12 @@ val remq(val obj, val list)
return make_like(out, list_orig);
}
-val remql(val obj, val list)
+val remql(val obj, val list_orig)
{
list_collect_decl (out, ptail);
- val list_orig = list;
+ val list = tolist(list_orig);
val lastmatch = cons(nil, list);
- list = nullify(list);
-
gc_hint(list);
for (; list; list = cdr(list)) {
@@ -1516,14 +1513,12 @@ val remql(val obj, val list)
return make_like(out, list_orig);
}
-val remqual(val obj, val list)
+val remqual(val obj, val list_orig)
{
list_collect_decl (out, ptail);
- val list_orig = list;
+ val list = tolist(list_orig);
val lastmatch = cons(nil, list);
- list = nullify(list);
-
gc_hint(list);
for (; list; list = cdr(list)) {
@@ -1536,16 +1531,14 @@ val remqual(val obj, val list)
return make_like(out, list_orig);
}
-val remove_if(val pred, val list, val key)
+val remove_if(val pred, val list_orig, val key)
{
list_collect_decl (out, ptail);
- val list_orig = list;
+ val list = tolist(list_orig);
val lastmatch = cons(nil, list);
key = default_arg(key, identity_f);
- list = nullify(list);
-
gc_hint(list);
for (; list; list = cdr(list)) {
@@ -1561,16 +1554,14 @@ val remove_if(val pred, val list, val key)
return make_like(out, list_orig);
}
-val keep_if(val pred, val list, val key)
+val keep_if(val pred, val list_orig, val key)
{
list_collect_decl (out, ptail);
- val list_orig = list;
+ val list = tolist(list_orig);
val lastmatch = cons(nil, list);
key = default_arg(key, identity_f);
- list = nullify(list);
-
gc_hint(list);
for (; list; list = cdr(list)) {