summaryrefslogtreecommitdiffhomepage
path: root/src/range.c
diff options
context:
space:
mode:
authortaiyoslime <[email protected]>2020-10-05 19:53:05 +0900
committertaiyoslime <[email protected]>2020-10-13 14:09:36 +0900
commitbec4d053400c3a11c8efd68c3e8bd5ea4a0bcc54 (patch)
tree166195f4009b90a90d1fe1b28ad4c8c84ba2597d /src/range.c
parent9ea7b718683386d2dc0787e919fc3d413ab20e67 (diff)
downloadmruby-bec4d053400c3a11c8efd68c3e8bd5ea4a0bcc54.tar.gz
mruby-bec4d053400c3a11c8efd68c3e8bd5ea4a0bcc54.zip
Introduce endless range (a part of #5085)
Co-Authored-By: n4o847 <[email protected]> Co-Authored-By: smallkirby <[email protected]>
Diffstat (limited to 'src/range.c')
-rw-r--r--src/range.c28
1 files changed, 18 insertions, 10 deletions
diff --git a/src/range.c b/src/range.c
index 0b4e6dbca..3f3382c4a 100644
--- a/src/range.c
+++ b/src/range.c
@@ -32,6 +32,8 @@ r_check(mrb_state *mrb, mrb_value a, mrb_value b)
return;
}
+ if (mrb_nil_p(b)) return;
+
n = mrb_cmp(mrb, a, b);
if (n == -2) { /* can not be compared */
mrb_raise(mrb, E_ARGUMENT_ERROR, "bad value for range");
@@ -212,15 +214,19 @@ range_include(mrb_state *mrb, mrb_value range)
mrb_value val = mrb_get_arg1(mrb);
struct RRange *r = mrb_range_ptr(mrb, range);
mrb_value beg, end;
- mrb_bool include_p;
beg = RANGE_BEG(r);
end = RANGE_END(r);
- include_p = r_le(mrb, beg, val) && /* beg <= val */
- (RANGE_EXCL(r) ? r_gt(mrb, end, val) /* end > val */
- : r_ge(mrb, end, val)); /* end >= val */
-
- return mrb_bool_value(include_p);
+ if (r_le(mrb, beg, val)) { /* beg <= val */
+ if (mrb_nil_p(end)) {
+ return mrb_true_value();
+ }
+ if (RANGE_EXCL(r) ? r_gt(mrb, end, val) /* end > val */
+ : r_ge(mrb, end, val)) { /* end >= val */
+ return mrb_true_value();
+ }
+ }
+ return mrb_false_value();
}
/* 15.2.14.4.12(x) */
@@ -261,10 +267,10 @@ range_inspect(mrb_state *mrb, mrb_value range)
struct RRange *r = mrb_range_ptr(mrb, range);
str = mrb_inspect(mrb, RANGE_BEG(r));
- str2 = mrb_inspect(mrb, RANGE_END(r));
+ if (!mrb_nil_p(RANGE_END(r))) str2 = mrb_inspect(mrb, RANGE_END(r));
str = mrb_str_dup(mrb, str);
mrb_str_cat(mrb, str, "...", RANGE_EXCL(r) ? 3 : 2);
- mrb_str_cat_str(mrb, str, str2);
+ if (!mrb_nil_p(RANGE_END(r))) mrb_str_cat_str(mrb, str, str2);
return str;
}
@@ -381,13 +387,15 @@ MRB_API enum mrb_range_beg_len
mrb_range_beg_len(mrb_state *mrb, mrb_value range, mrb_int *begp, mrb_int *lenp, mrb_int len, mrb_bool trunc)
{
mrb_int beg, end;
+ mrb_bool excl;
struct RRange *r;
if (!mrb_range_p(range)) return MRB_RANGE_TYPE_MISMATCH;
r = mrb_range_ptr(mrb, range);
beg = mrb_int(mrb, RANGE_BEG(r));
- end = mrb_int(mrb, RANGE_END(r));
+ end = mrb_nil_p(RANGE_END(r)) ? -1 : mrb_int(mrb, RANGE_END(r));
+ excl = mrb_nil_p(RANGE_END(r)) ? 0 : RANGE_EXCL(r);
if (beg < 0) {
beg += len;
@@ -400,7 +408,7 @@ mrb_range_beg_len(mrb_state *mrb, mrb_value range, mrb_int *begp, mrb_int *lenp,
}
if (end < 0) end += len;
- if (!RANGE_EXCL(r) && (!trunc || end < len)) end++; /* include end point */
+ if (!excl && (!trunc || end < len)) end++; /* include end point */
len = end - beg;
if (len < 0) len = 0;