mirror of
https://github.com/mruby/mruby
synced 2026-06-08 16:11:16 +00:00
Simplify mrb_range_beg_len(). Don't use OTHER macro.
This commit is contained in:
@@ -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" { */
|
||||
|
||||
+9
-15
@@ -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) */
|
||||
|
||||
+8
-9
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user