diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2012-02-22 17:35:25 -0800 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2012-02-22 17:35:25 -0800 |
commit | 1072417ca13b56e338b88fd2389b3b25861c6193 (patch) | |
tree | 3068dd3e230b5327a4d4856715a7e1faf5d9b41c /lib.c | |
parent | ad3a952d7dd471995270a0c044b1d22ca4da8585 (diff) | |
download | txr-1072417ca13b56e338b88fd2389b3b25861c6193.tar.gz txr-1072417ca13b56e338b88fd2389b3b25861c6193.tar.bz2 txr-1072417ca13b56e338b88fd2389b3b25861c6193.zip |
* 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.
Diffstat (limited to 'lib.c')
-rw-r--r-- | lib.c | 33 |
1 files changed, 27 insertions, 6 deletions
@@ -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; |