static mrb_value hs_regexp_equal(mrb_state *mrb, mrb_value self) { mrb_value other; struct mrb_hs_regexp *self_reg, *other_reg; mrb_get_args(mrb, "o", &other); if (mrb_obj_equal(mrb, self, other)){ return mrb_true_value(); } if (mrb_type(other) != MRB_TT_DATA || DATA_TYPE(other) != &mrb_hs_regexp_type){ return mrb_false_value(); } self_reg = (struct mrb_hs_regexp *)DATA_PTR(self); other_reg = (struct mrb_hs_regexp *)DATA_PTR(other); if (!self_reg || !other_reg){ mrb_raise(mrb, E_RUNTIME_ERROR, "Invalid HsRegexp"); } if (self_reg->flag != other_reg->flag){ return mrb_false_value(); } return mrb_str_equal(mrb, mrb_iv_get(mrb, self, INTERN("@source")), mrb_iv_get(mrb, other, INTERN("@source"))) ? mrb_true_value() : mrb_false_value(); }
static mrb_value regexp_equal(mrb_state *mrb, mrb_value self) { mrb_value other; struct mrb_regexp_pcre *self_reg, *other_reg; mrb_get_args(mrb, "o", &other); if (mrb_obj_equal(mrb, self, other)) { return mrb_true_value(); } if (mrb_type(other) != MRB_TT_DATA || DATA_TYPE(other) != &mrb_regexp_type) { return mrb_false_value(); } self_reg = (struct mrb_regexp_pcre *)DATA_PTR(self); other_reg = (struct mrb_regexp_pcre *)DATA_PTR(other); if (!self_reg || !other_reg) { mrb_raise(mrb, E_RUNTIME_ERROR, "Invalid Regexp"); } if (mrb_str_equal(mrb, mrb_iv_get(mrb, self, mrb_intern_lit(mrb, "@source")), mrb_iv_get(mrb, other, mrb_intern_lit(mrb, "@source")))) { return mrb_true_value(); } return mrb_false_value(); }
static mrb_value pcre_regexp_equal(mrb_state *mrb, mrb_value self) { mrb_value other, regexp_self, regexp_other; struct mrb_pcre_regexp *self_reg, *other_reg; mrb_get_args(mrb, "o", &other); if (mrb_obj_equal(mrb, self, other)){ return mrb_true_value(); } if (mrb_nil_p(other)) { return mrb_false_value(); } regexp_self = mrb_iv_get(mrb, self, mrb_intern_lit(mrb, "@regexp")); regexp_other = mrb_iv_get(mrb, other, mrb_intern_lit(mrb, "@regexp")); Data_Get_Struct(mrb, regexp_self, &mrb_pcre_regexp_type, self_reg); Data_Get_Struct(mrb, regexp_other, &mrb_pcre_regexp_type, other_reg); if (!self_reg || !other_reg){ mrb_raise(mrb, E_RUNTIME_ERROR, "Invalid PcreRegexp"); } if (self_reg->flag != other_reg->flag){ return mrb_false_value(); } return mrb_str_equal(mrb, mrb_iv_get(mrb, self, mrb_intern_lit(mrb, "@source")), mrb_iv_get(mrb, other, mrb_intern_lit(mrb, "@source"))) ? mrb_true_value() : mrb_false_value(); }
static inline khint_t mrb_hash_ht_hash_equal(mrb_state *mrb, mrb_value a, mrb_value b) { enum mrb_vtype t = mrb_type(a); switch (t) { case MRB_TT_STRING: return mrb_str_equal(mrb, a, b); case MRB_TT_SYMBOL: if (mrb_type(b) != MRB_TT_SYMBOL) return FALSE; return mrb_symbol(a) == mrb_symbol(b); case MRB_TT_FIXNUM: switch (mrb_type(b)) { case MRB_TT_FIXNUM: return mrb_fixnum(a) == mrb_fixnum(b); case MRB_TT_FLOAT: return (mrb_float)mrb_fixnum(a) == mrb_float(b); default: return FALSE; } case MRB_TT_FLOAT: switch (mrb_type(b)) { case MRB_TT_FIXNUM: return mrb_float(a) == (mrb_float)mrb_fixnum(b); case MRB_TT_FLOAT: return mrb_float(a) == mrb_float(b); default: return FALSE; } default: return mrb_eql(mrb, a, b); } }