diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2020-10-16 17:29:23 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2020-10-16 17:29:23 +0900 |
| commit | 27492e53a0440aee7c411d5e72b6f092cf85d6a1 (patch) | |
| tree | 3b8afa673da80cf147080f19953e7cb778f6d63d /src/range.c | |
| parent | 8d36393a5bc98d8988cfd73cbadb06d73090e54e (diff) | |
| download | mruby-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.c | 21 |
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); |
