From 1072417ca13b56e338b88fd2389b3b25861c6193 Mon Sep 17 00:00:00 2001 From: Kaz Kylheku Date: Wed, 22 Feb 2012 17:35:25 -0800 Subject: * lib.c (sub_list, replace_list, lazy_sub_str, sub_str, replace_str, sub_vec, replace_vec): Implementing floating zero behavior. This is necessary so that the important case index .. (+ index 1) for selecting one element as a subrange works even if index is negative. * txr.1: Floating zero behavior for ranges documented. --- lib.c | 33 +++++++++++++++++++++++++++------ 1 file changed, 27 insertions(+), 6 deletions(-) (limited to 'lib.c') diff --git a/lib.c b/lib.c index db4b145e..657bbb66 100644 --- a/lib.c +++ b/lib.c @@ -443,8 +443,11 @@ val sub_list(val list, val from, val to) from = zero; else if (from == t) from = nil; - else if (lt(from, zero)) + else if (lt(from, zero)) { from = plus(from, len = length(list)); + if (zerop(to)) + to = nil; + } if (to == t) to = nil; @@ -494,8 +497,11 @@ val replace_list(val list, val items, val from, val to) from = zero; else if (from == t) from = nil; - else if (lt(from, zero)) + else if (lt(from, zero)) { from = plus(from, len ? len : (len = length(list))); + if (zerop(to)) + to = len; + } if (to == t) to = nil; @@ -1483,6 +1489,9 @@ static val lazy_sub_str(val lstr, val from, val to) if (lt(from, zero)) { from = plus(from, len = length_str(lstr)); from = max2(zero, from); + + if (zerop(to)) + to = t; } if (ge(from, len_pfx)) { @@ -1534,8 +1543,11 @@ val sub_str(val str_in, val from, val to) from = zero; else if (from == t) return null_string; - else if (lt(from, zero)) + else if (lt(from, zero)) { from = plus(from, len); + if (zerop(to)) + to = len; + } if (to == nil || to == t) to = len; @@ -1572,8 +1584,11 @@ val replace_str(val str_in, val items, val from, val to) from = zero; else if (from == t) from = len; - else if (lt(from, zero)) + else if (lt(from, zero)) { from = plus(from, len); + if (zerop(to)) + to = len; + } if (to == nil || to == t) to = len; @@ -2939,8 +2954,11 @@ val sub_vec(val vec_in, val from, val to) from = zero; else if (from == t) from = len; - else if (lt(from, zero)) + else if (lt(from, zero)) { from = plus(from, len); + if (zerop(to)) + to = len; + } if (to == nil || to == t) to = len; @@ -2979,8 +2997,11 @@ val replace_vec(val vec_in, val items, val from, val to) from = zero; else if (from == t) from = len; - else if (lt(from, zero)) + else if (lt(from, zero)) { from = plus(from, len); + if (zerop(to)) + to = len; + } if (to == nil || to == t) to = len; -- cgit v1.2.3