summaryrefslogtreecommitdiffhomepage
path: root/src/range.c
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2020-10-16 17:29:23 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2020-10-16 17:29:23 +0900
commit27492e53a0440aee7c411d5e72b6f092cf85d6a1 (patch)
tree3b8afa673da80cf147080f19953e7cb778f6d63d /src/range.c
parent8d36393a5bc98d8988cfd73cbadb06d73090e54e (diff)
downloadmruby-27492e53a0440aee7c411d5e72b6f092cf85d6a1.tar.gz
mruby-27492e53a0440aee7c411d5e72b6f092cf85d6a1.zip
Add startless range (another part of #5085)
Ref #5093; close #5085
Diffstat (limited to 'src/range.c')
-rw-r--r--src/range.c21
1 files changed, 16 insertions, 5 deletions
diff --git a/src/range.c b/src/range.c
index 65e458942..4d175da98 100644
--- a/src/range.c
+++ b/src/range.c
@@ -32,7 +32,7 @@ r_check(mrb_state *mrb, mrb_value a, mrb_value b)
return;
}
- if (mrb_nil_p(b)) return;
+ if (mrb_nil_p(a) || mrb_nil_p(b)) return;
n = mrb_cmp(mrb, a, b);
if (n == -2) { /* can not be compared */
@@ -217,7 +217,13 @@ range_include(mrb_state *mrb, mrb_value range)
beg = RANGE_BEG(r);
end = RANGE_END(r);
- if (r_le(mrb, beg, val)) { /* beg <= val */
+ if (mrb_nil_p(beg)) {
+ if (RANGE_EXCL(r) ? r_gt(mrb, end, val) /* end > val */
+ : r_ge(mrb, end, val)) { /* end >= val */
+ return mrb_true_value();
+ }
+ }
+ else if (r_le(mrb, beg, val)) { /* beg <= val */
if (mrb_nil_p(end)) {
return mrb_true_value();
}
@@ -266,9 +272,14 @@ range_inspect(mrb_state *mrb, mrb_value range)
mrb_value str;
struct RRange *r = mrb_range_ptr(mrb, range);
- str = mrb_inspect(mrb, RANGE_BEG(r));
- str = mrb_str_dup(mrb, str);
- mrb_str_cat(mrb, str, "...", RANGE_EXCL(r) ? 3 : 2);
+ if (!mrb_nil_p(RANGE_BEG(r))) {
+ str = mrb_inspect(mrb, RANGE_BEG(r));
+ str = mrb_str_dup(mrb, str);
+ mrb_str_cat(mrb, str, "...", RANGE_EXCL(r) ? 3 : 2);
+ }
+ else {
+ str = mrb_str_new(mrb, "...", RANGE_EXCL(r) ? 3 : 2);
+ }
if (!mrb_nil_p(RANGE_END(r))) {
mrb_value str2 = mrb_inspect(mrb, RANGE_END(r));
mrb_str_cat_str(mrb, str, str2);