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 { ...@@ -26,7 +26,7 @@ struct RRange {
#define mrb_range_value(p) mrb_obj_value((void*)(p)) #define mrb_range_value(p) mrb_obj_value((void*)(p))
mrb_value mrb_range_new(mrb_state*, mrb_value, mrb_value, int); 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) #if defined(__cplusplus)
} /* extern "C" { */ } /* extern "C" { */
......
...@@ -10,10 +10,6 @@ ...@@ -10,10 +10,6 @@
#include "mruby/string.h" #include "mruby/string.h"
#include <string.h> #include <string.h>
#ifndef OTHER
#define OTHER 2
#endif
#define RANGE_CLASS (mrb_class_obj_get(mrb, "Range")) #define RANGE_CLASS (mrb_class_obj_get(mrb, "Range"))
static void static void
...@@ -274,12 +270,14 @@ mrb_range_each(mrb_state *mrb, mrb_value range) ...@@ -274,12 +270,14 @@ mrb_range_each(mrb_state *mrb, mrb_value range)
} }
mrb_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_range_beg_len(mrb_state *mrb, mrb_value range, mrb_int *begp, mrb_int *lenp, mrb_int len)
{ {
mrb_int beg, end, b, e; mrb_int beg, end, b, e;
struct RRange *r = mrb_range_ptr(range); 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); beg = b = mrb_fixnum(r->edges->beg);
end = e = mrb_fixnum(r->edges->end); 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, ...@@ -288,10 +286,10 @@ mrb_range_beg_len(mrb_state *mrb, mrb_value range, mrb_int *begp, mrb_int *lenp,
beg += len; beg += len;
if (beg < 0) goto out_of_range; if (beg < 0) goto out_of_range;
} }
if (err == 0 || err == 2) {
if (beg > len) goto out_of_range; if (beg > len) goto out_of_range;
if (end > len) end = len; if (end > len) end = len;
}
if (end < 0) end += len; if (end < 0) end += len;
if (!r->excl && end < len) end++; /* include end point */ if (!r->excl && end < len) end++; /* include end point */
len = end - beg; len = end - beg;
...@@ -302,11 +300,7 @@ mrb_range_beg_len(mrb_state *mrb, mrb_value range, mrb_int *begp, mrb_int *lenp, ...@@ -302,11 +300,7 @@ mrb_range_beg_len(mrb_state *mrb, mrb_value range, mrb_int *begp, mrb_int *lenp,
return TRUE; return TRUE;
out_of_range: out_of_range:
if (err) { return FALSE;
mrb_raisef(mrb, E_RANGE_ERROR, "%ld..%s%ld out of range",
b, r->excl? "." : "", e);
}
return OTHER;
} }
/* 15.2.14.4.12(x) */ /* 15.2.14.4.12(x) */
......
...@@ -759,23 +759,22 @@ num_index: ...@@ -759,23 +759,22 @@ num_index:
return mrb_str_dup(mrb, indx); return mrb_str_dup(mrb, indx);
return mrb_nil_value(); return mrb_nil_value();
default: case MRB_TT_RANGE:
/* check if indx is Range */ /* check if indx is Range */
{ {
mrb_int beg, len; mrb_int beg, len;
mrb_value tmp; mrb_value tmp;
len = RSTRING_LEN(str); len = RSTRING_LEN(str);
switch (mrb_range_beg_len(mrb, indx, &beg, &len, len, 0)) { if (mrb_range_beg_len(mrb, indx, &beg, &len, len)) {
case FALSE: tmp = mrb_str_subseq(mrb, str, beg, len);
break; return tmp;
case 2/*OTHER*/: }
return mrb_nil_value(); else {
default: return mrb_nil_value();
tmp = mrb_str_subseq(mrb, str, beg, len);
return tmp;
} }
} }
default:
idx = mrb_fixnum(indx); idx = mrb_fixnum(indx);
goto num_index; 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