Commit d7904418 authored by Yukihiro "Matz" Matsumoto's avatar Yukihiro "Matz" Matsumoto

Merge pull request #893 from monaka/pr-simplify-mrb_range_beg_len

Simplify mrb_range_beg_len(). Don't use OTHER macro.
parents ced8fea3 cb7cf4e7
......@@ -26,7 +26,7 @@ struct RRange {
#define mrb_range_value(p) mrb_obj_value((void*)(p))
mrb_value mrb_range_new(mrb_state*, mrb_value, mrb_value, int);
mrb_int mrb_range_beg_len(mrb_state *mrb, mrb_value range, mrb_int *begp, mrb_int *lenp, mrb_int len, mrb_int err);
mrb_int mrb_range_beg_len(mrb_state *mrb, mrb_value range, mrb_int *begp, mrb_int *lenp, mrb_int len);
#if defined(__cplusplus)
} /* extern "C" { */
......
......@@ -10,10 +10,6 @@
#include "mruby/string.h"
#include <string.h>
#ifndef OTHER
#define OTHER 2
#endif
#define RANGE_CLASS (mrb_class_obj_get(mrb, "Range"))
static void
......@@ -274,12 +270,14 @@ mrb_range_each(mrb_state *mrb, mrb_value range)
}
mrb_int
mrb_range_beg_len(mrb_state *mrb, mrb_value range, mrb_int *begp, mrb_int *lenp, mrb_int len, mrb_int err)
mrb_range_beg_len(mrb_state *mrb, mrb_value range, mrb_int *begp, mrb_int *lenp, mrb_int len)
{
mrb_int beg, end, b, e;
struct RRange *r = mrb_range_ptr(range);
if (mrb_type(range) != MRB_TT_RANGE) return FALSE;
if (mrb_type(range) != MRB_TT_RANGE) {
mrb_raise(mrb, E_TYPE_ERROR, "expected Range.");
}
beg = b = mrb_fixnum(r->edges->beg);
end = e = mrb_fixnum(r->edges->end);
......@@ -288,10 +286,10 @@ mrb_range_beg_len(mrb_state *mrb, mrb_value range, mrb_int *begp, mrb_int *lenp,
beg += len;
if (beg < 0) goto out_of_range;
}
if (err == 0 || err == 2) {
if (beg > len) goto out_of_range;
if (end > len) end = len;
}
if (beg > len) goto out_of_range;
if (end > len) end = len;
if (end < 0) end += len;
if (!r->excl && end < len) end++; /* include end point */
len = end - beg;
......@@ -302,11 +300,7 @@ mrb_range_beg_len(mrb_state *mrb, mrb_value range, mrb_int *begp, mrb_int *lenp,
return TRUE;
out_of_range:
if (err) {
mrb_raisef(mrb, E_RANGE_ERROR, "%ld..%s%ld out of range",
b, r->excl? "." : "", e);
}
return OTHER;
return FALSE;
}
/* 15.2.14.4.12(x) */
......
......@@ -759,23 +759,22 @@ num_index:
return mrb_str_dup(mrb, indx);
return mrb_nil_value();
default:
case MRB_TT_RANGE:
/* check if indx is Range */
{
mrb_int beg, len;
mrb_value tmp;
len = RSTRING_LEN(str);
switch (mrb_range_beg_len(mrb, indx, &beg, &len, len, 0)) {
case FALSE:
break;
case 2/*OTHER*/:
return mrb_nil_value();
default:
tmp = mrb_str_subseq(mrb, str, beg, len);
return tmp;
if (mrb_range_beg_len(mrb, indx, &beg, &len, len)) {
tmp = mrb_str_subseq(mrb, str, beg, len);
return tmp;
}
else {
return mrb_nil_value();
}
}
default:
idx = mrb_fixnum(indx);
goto num_index;
}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment