summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2012-01-26 16:20:10 -0800
committerKaz Kylheku <kaz@kylheku.com>2012-01-26 16:20:10 -0800
commitfbe0c77a06a711bd746261406e47c16c55e660a8 (patch)
treea068b5fab79f0d49356c658bf94ad5f17bd15e0f
parent9fc7ba486d0a17cb4503319f0bb2c675f96ea0c1 (diff)
downloadtxr-fbe0c77a06a711bd746261406e47c16c55e660a8.tar.gz
txr-fbe0c77a06a711bd746261406e47c16c55e660a8.tar.bz2
txr-fbe0c77a06a711bd746261406e47c16c55e660a8.zip
* lib.c (listref, listref_l): Negative indices must have semantics
consistent with vecref and ranges.
-rw-r--r--ChangeLog5
-rw-r--r--lib.c5
2 files changed, 9 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog
index acef717f..6c942cf2 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,10 @@
2012-01-26 Kaz Kylheku <kaz@kylheku.com>
+ * lib.c (listref, listref_l): Negative indices must have semantics
+ consistent with vecref and ranges.
+
+2012-01-26 Kaz Kylheku <kaz@kylheku.com>
+
* lib.c (cat_str): Throw error if one of the list elements
is not a character or string instead of silently returning nil.
diff --git a/lib.c b/lib.c
index 29049969..3dd57738 100644
--- a/lib.c
+++ b/lib.c
@@ -310,7 +310,7 @@ val sixth(val cons)
val listref(val list, val ind)
{
if (lt(ind, zero))
- return nil;
+ ind = plus(ind, length_list(list));
for (; gt(ind, zero); ind = minus(ind, one))
list = cdr(list);
return car(list);
@@ -321,6 +321,9 @@ val *listref_l(val list, val ind)
val olist = list;
val oind = ind;
+ if (lt(ind, zero))
+ ind = plus(ind, length_list(list));
+
for (; gt(ind, zero) && list; ind = minus(ind, one))
list = cdr(list);
if (consp(list))