diff options
Diffstat (limited to 'spec/ruby/optional/capi/ext/range_spec.c')
| -rw-r--r-- | spec/ruby/optional/capi/ext/range_spec.c | 68 |
1 files changed, 46 insertions, 22 deletions
diff --git a/spec/ruby/optional/capi/ext/range_spec.c b/spec/ruby/optional/capi/ext/range_spec.c index 6dc2d579fd..9faed3e5ee 100644 --- a/spec/ruby/optional/capi/ext/range_spec.c +++ b/spec/ruby/optional/capi/ext/range_spec.c @@ -5,17 +5,14 @@ extern "C" { #endif -#ifdef HAVE_RB_RANGE_NEW VALUE range_spec_rb_range_new(int argc, VALUE* argv, VALUE self) { int exclude_end = 0; - if(argc == 3) { + if (argc == 3) { exclude_end = RTEST(argv[2]); } return rb_range_new(argv[0], argv[1], exclude_end); } -#endif -#ifdef HAVE_RB_RANGE_VALUES VALUE range_spec_rb_range_values(VALUE self, VALUE range) { VALUE beg; VALUE end; @@ -27,12 +24,10 @@ VALUE range_spec_rb_range_values(VALUE self, VALUE range) { rb_ary_store(ary, 2, excl ? Qtrue : Qfalse); return ary; } -#endif -#ifdef HAVE_RB_RANGE_BEG_LEN -VALUE range_spec_rb_range_beg_len(VALUE self, VALUE range, VALUE begpv, VALUE lenpv, VALUE lenv, VALUE errv) { - long begp = FIX2LONG(begpv); - long lenp = FIX2LONG(lenpv); +VALUE range_spec_rb_range_beg_len(VALUE self, VALUE range, VALUE lenv, VALUE errv) { + long begp = 0; + long lenp = 0; long len = FIX2LONG(lenv); int err = FIX2INT(errv); VALUE ary = rb_ary_new(); @@ -42,23 +37,52 @@ VALUE range_spec_rb_range_beg_len(VALUE self, VALUE range, VALUE begpv, VALUE le rb_ary_store(ary, 2, res); return ary; } -#endif -void Init_range_spec(void) { - VALUE cls; - cls = rb_define_class("CApiRangeSpecs", rb_cObject); +VALUE range_spec_rb_arithmetic_sequence_extract(VALUE self, VALUE object) { + VALUE ary = rb_ary_new(); + rb_arithmetic_sequence_components_t components; -#ifdef HAVE_RB_RANGE_NEW - rb_define_method(cls, "rb_range_new", range_spec_rb_range_new, -1); -#endif + int status = rb_arithmetic_sequence_extract(object, &components); -#ifdef HAVE_RB_RANGE_VALUES - rb_define_method(cls, "rb_range_values", range_spec_rb_range_values, 1); -#endif + if (!status) { + rb_ary_store(ary, 0, LONG2FIX(status)); + return ary; + } -#ifdef HAVE_RB_RANGE_BEG_LEN - rb_define_method(cls, "rb_range_beg_len", range_spec_rb_range_beg_len, 5); -#endif + rb_ary_store(ary, 0, LONG2FIX(status)); + rb_ary_store(ary, 1, components.begin); + rb_ary_store(ary, 2, components.end); + rb_ary_store(ary, 3, components.step); + rb_ary_store(ary, 4, components.exclude_end ? Qtrue : Qfalse); + return ary; +} + +VALUE range_spec_rb_arithmetic_sequence_beg_len_step(VALUE self, VALUE aseq, VALUE lenv, VALUE errv) { + long begp = 0; + long lenp = 0; + long stepp = 0; + + long len = FIX2LONG(lenv); + int err = FIX2INT(errv); + + VALUE success = rb_arithmetic_sequence_beg_len_step(aseq, &begp, &lenp, &stepp, len, err); + + VALUE ary = rb_ary_new(); + rb_ary_store(ary, 0, success); + rb_ary_store(ary, 1, LONG2FIX(begp)); + rb_ary_store(ary, 2, LONG2FIX(lenp)); + rb_ary_store(ary, 3, LONG2FIX(stepp)); + + return ary; +} + +void Init_range_spec(void) { + VALUE cls = rb_define_class("CApiRangeSpecs", rb_cObject); + rb_define_method(cls, "rb_range_new", range_spec_rb_range_new, -1); + rb_define_method(cls, "rb_range_values", range_spec_rb_range_values, 1); + rb_define_method(cls, "rb_range_beg_len", range_spec_rb_range_beg_len, 3); + rb_define_method(cls, "rb_arithmetic_sequence_extract", range_spec_rb_arithmetic_sequence_extract, 1); + rb_define_method(cls, "rb_arithmetic_sequence_beg_len_step", range_spec_rb_arithmetic_sequence_beg_len_step, 3); } #ifdef __cplusplus |
