summaryrefslogtreecommitdiffstats
path: root/lib.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib.c')
-rw-r--r--lib.c43
1 files changed, 9 insertions, 34 deletions
diff --git a/lib.c b/lib.c
index a1235247..c7bf5b05 100644
--- a/lib.c
+++ b/lib.c
@@ -590,8 +590,14 @@ static int seq_iter_get_range_str(seq_iter_t *it, val *pval)
*pval = it->ui.vn;
for (; l > 0; l--) {
- if (++nx[l - 1] <= bn[l - 1])
- break;
+ if (in[l - 1] < bn[l - 1]) {
+ if (++nx[l - 1] <= bn[l - 1])
+ break;
+ } else {
+ if (--nx[l - 1] >= bn[l - 1])
+ break;
+ }
+
nx[l - 1] = in[l - 1];
}
@@ -666,33 +672,6 @@ static int seq_iter_peek_rev_range_number(seq_iter_t *it, val *pval)
return 0;
}
-static int seq_iter_get_rev_range_str(seq_iter_t *it, val *pval)
-{
- if (it->ui.vn) {
- val init = from(it->inf.obj);
- val len = length_str(init);
- val next = copy_str(it->ui.vn);
- cnum l = c_num(len, nil);
- wchar_t *nx = strip_qual(wchar_t *, c_str(next, nil));
- const wchar_t *in = c_str(init, nil);
- const wchar_t *bn = c_str(it->ul.vbound, nil);
-
- *pval = it->ui.vn;
-
- for (; l > 0; l--) {
- if (--nx[l - 1] >= bn[l - 1])
- break;
- nx[l - 1] = in[l - 1];
- }
-
- it->ui.vn = if2(l > 0, next);
-
- return 1;
- }
-
- return 0;
-}
-
static int seq_iter_get_chr(seq_iter_t *it, val *pval)
{
if (it->ui.index <= 0x10FFFF) {
@@ -1000,10 +979,6 @@ struct seq_iter_ops si_rev_range_number_ops =
seq_iter_ops_init(seq_iter_get_rev_range_number,
seq_iter_peek_rev_range_number);
-struct seq_iter_ops si_rev_range_str_ops =
- seq_iter_ops_init(seq_iter_get_rev_range_str,
- seq_iter_peek_range_str);
-
struct seq_iter_ops si_chr_ops = seq_iter_ops_init_nomark(seq_iter_get_chr,
seq_iter_peek_chr);
@@ -1133,7 +1108,7 @@ void seq_iter_init_with_info(val self, seq_iter_t *it,
case LSTR:
it->ui.vn = copy_str(rf);
it->ul.vbound = rt;
- it->ops = &si_rev_range_str_ops;
+ it->ops = &si_range_str_ops;
if (eql(length_str(rf), length_str(rt)))
break;
/* fallthrough */