diff -urN oniguruma-185/Makefile.in oniguruma/Makefile.in --- oniguruma-185/Makefile.in 2006-11-07 22:45:50.000000000 -0700 +++ oniguruma/Makefile.in 2007-02-19 22:34:07.000000000 -0700 @@ -214,7 +214,10 @@ 185: cpruby patch -d $(RUBYDIR) -p0 < $(srcdir)/ruby185.patch -18: 185 +186: cpruby + patch -d $(RUBYDIR) -p0 < $(srcdir)/ruby186.patch + +18: 186 # backup file suffix SORIG = ruby_orig diff -urN oniguruma-185/ruby186.patch oniguruma/ruby186.patch --- oniguruma-185/ruby186.patch 1969-12-31 17:00:00.000000000 -0700 +++ oniguruma/ruby186.patch 2007-02-19 22:34:54.000000000 -0700 @@ -0,0 +1,321 @@ +--- gc.c.ruby_orig 2006-08-25 17:12:46.000000000 +0900 ++++ gc.c 2006-11-08 14:11:06.000000000 +0900 +@@ -968,6 +968,7 @@ gc_mark_children(ptr, lev) + break; + + case T_MATCH: ++ gc_mark(obj->as.match.regexp, lev); + if (obj->as.match.str) { + ptr = obj->as.match.str; + goto again; +--- re.h.ruby_orig 2003-03-04 23:12:19.000000000 +0900 ++++ re.h 2006-11-08 14:11:06.000000000 +0900 +@@ -24,13 +24,14 @@ struct RMatch { + struct RBasic basic; + VALUE str; + struct re_registers *regs; ++ VALUE regexp; /* RRegexp */ + }; + + #define RMATCH(obj) (R_CAST(RMatch)(obj)) + + VALUE rb_reg_regcomp _((VALUE)); + long rb_reg_search _((VALUE, VALUE, long, long)); +-VALUE rb_reg_regsub _((VALUE, VALUE, struct re_registers *)); ++VALUE rb_reg_regsub _((VALUE, VALUE, struct re_registers *, VALUE)); + long rb_reg_adjust_startpos _((VALUE, VALUE, long, long)); + void rb_match_busy _((VALUE)); + VALUE rb_reg_quote _((VALUE)); +--- re.c.ruby_orig 2007-02-12 16:01:19.000000000 -0700 ++++ re.c 2007-02-19 22:32:31.000000000 -0700 +@@ -486,10 +486,12 @@ + } + if (*ptr == ':' && ptr[len-1] == ')') { + Regexp *rp; ++ int r; + rb_kcode_set_option(re); +- rp = ALLOC(Regexp); +- MEMZERO((char *)rp, Regexp, 1); +- err = re_compile_pattern(++ptr, len -= 2, rp) != 0; ++ r = re_alloc_pattern(&rp); ++ if (r == 0) { ++ err = (re_compile_pattern(++ptr, len -= 2, rp, NULL) != 0); ++ } + rb_kcode_reset_option(); + re_free_pattern(rp); + } +@@ -623,7 +625,9 @@ + int flags; + { + Regexp *rp; +- char *err; ++ char err[ONIG_MAX_ERROR_MESSAGE_LEN]; ++ int r; ++ + + /* Handle escaped characters first. */ + +@@ -632,17 +636,18 @@ + from that. + */ + +- rp = ALLOC(Regexp); +- MEMZERO((char *)rp, Regexp, 1); +- rp->buffer = ALLOC_N(char, 16); +- rp->allocated = 16; +- rp->fastmap = ALLOC_N(char, 256); ++ r = re_alloc_pattern(&rp); ++ if (r) { ++ re_error_code_to_str((UChar* )err, r); ++ rb_reg_raise(s, len, err, 0); ++ } ++ + if (flags) { + rp->options = flags; + } +- err = re_compile_pattern(s, len, rp); ++ r = re_compile_pattern(s, len, rp, err); + +- if (err != NULL) { ++ if (r != 0) { + re_free_pattern(rp); + rb_reg_raise(s, len, err, 0); + return 0; +@@ -676,6 +681,7 @@ + + match->str = 0; + match->regs = 0; ++ match->regexp = 0; + match->regs = ALLOC(struct re_registers); + MEMZERO(match->regs, struct re_registers, 1); + +@@ -693,6 +699,7 @@ + rb_raise(rb_eTypeError, "wrong argument class"); + } + RMATCH(obj)->str = RMATCH(orig)->str; ++ RMATCH(obj)->regexp = RMATCH(orig)->regexp; + re_free_registers(RMATCH(obj)->regs); + RMATCH(obj)->regs->allocated = 0; + re_copy_registers(RMATCH(obj)->regs, RMATCH(orig)->regs); +@@ -846,14 +853,15 @@ + } + + if (need_recompile) { +- char *err; ++ char err[ONIG_MAX_ERROR_MESSAGE_LEN]; ++ int r; ++ + + if (FL_TEST(re, KCODE_FIXED)) + rb_kcode_set_option(re); + rb_reg_check(re); +- RREGEXP(re)->ptr->fastmap_accurate = 0; +- err = re_compile_pattern(RREGEXP(re)->str, RREGEXP(re)->len, RREGEXP(re)->ptr); +- if (err != NULL) { ++ r = re_recompile_pattern(RREGEXP(re)->str, RREGEXP(re)->len, RREGEXP(re)->ptr, err); ++ if (r != 0) { + rb_reg_raise(RREGEXP(re)->str, RREGEXP(re)->len, err, re); + } + } +@@ -920,14 +928,16 @@ + if (FL_TEST(re, KCODE_FIXED)) + rb_kcode_reset_option(); + +- if (result == -2) { +- rb_reg_raise(RREGEXP(re)->str, RREGEXP(re)->len, +- "Stack overflow in regexp matcher", re); +- } +- + if (result < 0) { +- rb_backref_set(Qnil); +- return result; ++ if (result == ONIG_MISMATCH) { ++ rb_backref_set(Qnil); ++ return result; ++ } ++ else { ++ char err[ONIG_MAX_ERROR_MESSAGE_LEN]; ++ re_error_code_to_str((UChar* )err, result); ++ rb_reg_raise(RREGEXP(re)->str, RREGEXP(re)->len, err, 0); ++ } + } + + match = rb_backref_get(); +@@ -943,6 +953,7 @@ + + re_copy_registers(RMATCH(match)->regs, ®s); + RMATCH(match)->str = rb_str_new4(str); ++ RMATCH(match)->regexp = re; + rb_backref_set(match); + + OBJ_INFECT(match, re); +@@ -1170,6 +1181,23 @@ + } + + ++static int ++name_to_backref_number(struct re_registers *regs, VALUE regexp, const char* name, const char* name_end) ++{ ++ int num; ++ ++ num = onig_name_to_backref_number(RREGEXP(regexp)->ptr, ++ (unsigned char* )name, (unsigned char* )name_end, regs); ++ if (num >= 1) { ++ return num; ++ } ++ else { ++ VALUE s = rb_str_new(name, (long )(name_end - name)); ++ rb_raise(rb_eRuntimeError, "undefined group name reference: %s", ++ StringValuePtr(s)); ++ } ++} ++ + /* + * call-seq: + * mtch[i] => obj +@@ -1199,10 +1227,37 @@ + + rb_scan_args(argc, argv, "11", &idx, &rest); + +- if (!NIL_P(rest) || !FIXNUM_P(idx) || FIX2INT(idx) < 0) { +- return rb_ary_aref(argc, argv, match_to_a(match)); ++ if (NIL_P(rest)) { ++ if (FIXNUM_P(idx)) { ++ if (FIX2INT(idx) >= 0) { ++ return rb_reg_nth_match(FIX2INT(idx), match); ++ } ++ } ++ else { ++ const char *p; ++ int num; ++ ++ switch (TYPE(idx)) { ++ case T_SYMBOL: ++ p = rb_id2name(SYM2ID(idx)); ++ goto name_to_backref; ++ break; ++ case T_STRING: ++ p = StringValuePtr(idx); ++ ++ name_to_backref: ++ num = name_to_backref_number(RMATCH(match)->regs, ++ RMATCH(match)->regexp, p, p + strlen(p)); ++ return rb_reg_nth_match(num, match); ++ break; ++ ++ default: ++ break; ++ } ++ } + } +- return rb_reg_nth_match(FIX2INT(idx), match); ++ ++ return rb_ary_aref(argc, argv, match_to_a(match)); + } + + static VALUE match_entry _((VALUE, long)); +@@ -2001,12 +2056,14 @@ + } + + VALUE +-rb_reg_regsub(str, src, regs) ++rb_reg_regsub(str, src, regs, regexp) + VALUE str, src; + struct re_registers *regs; ++ VALUE regexp; + { + VALUE val = 0; +- char *p, *s, *e, c; ++ char *p, *s, *e; ++ unsigned char uc; + int no; + + p = s = RSTRING(str)->ptr; +@@ -2015,12 +2072,12 @@ + while (s < e) { + char *ss = s; + +- c = *s++; +- if (ismbchar(c)) { +- s += mbclen(c) - 1; ++ uc = (unsigned char )*s++; ++ if (ismbchar(uc)) { ++ s += mbclen(uc) - 1; + continue; + } +- if (c != '\\' || s == e) continue; ++ if (uc != '\\' || s == e) continue; + + if (!val) { + val = rb_str_buf_new(ss-p); +@@ -2030,13 +2087,38 @@ + rb_str_buf_cat(val, p, ss-p); + } + +- c = *s++; ++ uc = (unsigned char )*s++; + p = s; +- switch (c) { +- case '0': case '1': case '2': case '3': case '4': ++ switch (uc) { ++ case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': case '9': +- no = c - '0'; ++ no = uc - '0'; + break; ++ ++ case 'k': ++ if (s < e && *s == '<') { ++ char *name, *name_end; ++ ++ name_end = name = s + 1; ++ while (name_end < e) { ++ if (*name_end == '>') break; ++ uc = (unsigned char)*name_end; ++ name_end += mbclen(uc); ++ } ++ if (name_end < e) { ++ no = name_to_backref_number(regs, regexp, name, name_end); ++ p = s = name_end + 1; ++ break; ++ } ++ else { ++ rb_raise(rb_eRuntimeError, "invalid group name reference format"); ++ } ++ } ++ ++ rb_str_buf_cat(val, s-2, 2); ++ continue; ++ ++ case '0': + case '&': + no = 0; + break; +@@ -2282,6 +2364,7 @@ + rb_define_const(rb_cRegexp, "IGNORECASE", INT2FIX(RE_OPTION_IGNORECASE)); + rb_define_const(rb_cRegexp, "EXTENDED", INT2FIX(RE_OPTION_EXTENDED)); + rb_define_const(rb_cRegexp, "MULTILINE", INT2FIX(RE_OPTION_MULTILINE)); ++ rb_define_const(rb_cRegexp, "ENGINE", rb_obj_freeze(rb_str_new2("Oniguruma"))); + + rb_global_variable(®_cache); + +--- string.c.ruby_orig 2006-07-31 15:34:10.000000000 +0900 ++++ string.c 2006-11-08 14:11:06.000000000 +0900 +@@ -1977,7 +1977,7 @@ rb_str_sub_bang(argc, argv, str) + rb_backref_set(match); + } + else { +- repl = rb_reg_regsub(repl, str, regs); ++ repl = rb_reg_regsub(repl, str, regs, pat); + } + if (OBJ_TAINTED(repl)) tainted = 1; + plen = END(0) - BEG(0); +@@ -2100,7 +2100,7 @@ str_gsub(argc, argv, str, bang) + rb_backref_set(match); + } + else { +- val = rb_reg_regsub(repl, str, regs); ++ val = rb_reg_regsub(repl, str, regs, pat); + } + if (OBJ_TAINTED(val)) tainted = 1; + len = (bp - buf) + (beg - offset) + RSTRING(val)->len + 3;