diff options
author | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2004-09-24 05:53:43 +0000 |
---|---|---|
committer | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2004-09-24 05:53:43 +0000 |
commit | c0a998d027eac8e9dc6d85b4b56c5e5bc87024a0 (patch) | |
tree | 49adb0e44abfd9d14f9c47517039e333bb98c50a /re.c | |
parent | 0c9d76889af8e00a946dbe8de33568fc87bdd983 (diff) |
* parse.y (rb_parser_append_print): should handle prelude.
[llama@u01.gate0]
* parse.y (rb_parser_while_loop): ditto.
* array.c (rb_ary_subseq): original object might be modified after
sharing data creation. [ruby-dev:24327]
* array.c (rb_ary_replace): ditto.
* array.c (ary_make_shared): freeze shared array. [ruby-dev:24325]
* struct.c (struct_members): always check struct size and size of
members list in the class. [ruby-dev:24320]
* string.c (rb_str_sub_bang): check if string is not modified
during iteration. [ruby-dev:24315]
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@6957 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 're.c')
-rw-r--r-- | re.c | 53 |
1 files changed, 33 insertions, 20 deletions
@@ -266,8 +266,6 @@ rb_reg_check(re) } } -extern int ruby_in_compile; - static void rb_reg_expr_str(str, s, len) VALUE str; @@ -520,15 +518,16 @@ rb_reg_to_s(re) } static void -rb_reg_raise(s, len, err, re) +rb_reg_raise(s, len, err, re, ce) const char *s; long len; const char *err; VALUE re; + int ce; { VALUE desc = rb_reg_desc(s, len, re); - if (ruby_in_compile) + if (ce) rb_compile_error("%s: %s", err, RSTRING(desc)->ptr); else rb_raise(rb_eRegexpError, "%s: %s", err, RSTRING(desc)->ptr); @@ -617,10 +616,11 @@ rb_reg_kcode_m(re) } static Regexp* -make_regexp(s, len, flags) +make_regexp(s, len, flags, ce) const char *s; long len; int flags; + int ce; { Regexp *rp; char err[ONIG_MAX_ERROR_MESSAGE_LEN]; @@ -636,7 +636,7 @@ make_regexp(s, len, flags) r = re_alloc_pattern(&rp); if (r) { re_error_code_to_str((UChar* )err, r); - rb_reg_raise(s, len, err, 0); + rb_reg_raise(s, len, err, 0, ce); } if (flags) { @@ -645,7 +645,7 @@ make_regexp(s, len, flags) r = re_compile_pattern(s, len, rp, err); if (r != 0) { - rb_reg_raise(s, len, err, 0); + rb_reg_raise(s, len, err, 0, ce); } return rp; } @@ -854,7 +854,7 @@ rb_reg_prepare_re(re) rb_reg_check(re); 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); + rb_reg_raise(RREGEXP(re)->str, RREGEXP(re)->len, err, re, Qfalse); } } } @@ -921,15 +921,15 @@ rb_reg_search(re, str, pos, reverse) kcode_reset_option(); if (result < 0) { - 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); - } + 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, Qfalse); + } } match = rb_backref_get(); @@ -1322,7 +1322,7 @@ match_string(match) VALUE rb_cRegexp; static void -rb_reg_initialize(obj, s, len, options) +rb_reg_initialize(obj, s, len, options, ce) VALUE obj; const char *s; long len; @@ -1333,6 +1333,7 @@ rb_reg_initialize(obj, s, len, options) /* CODE_EUC = 32 */ /* CODE_SJIS = 48 */ /* CODE_UTF8 = 64 */ + int ce; /* call rb_compile_error() */ { struct RRegexp *re = RREGEXP(obj); @@ -1367,7 +1368,7 @@ rb_reg_initialize(obj, s, len, options) options |= RE_OPTION_IGNORECASE; FL_SET(re, REG_CASESTATE); } - re->ptr = make_regexp(s, len, options & 0xf); + re->ptr = make_regexp(s, len, options & 0xf, ce); re->str = ALLOC_N(char, len+1); memcpy(re->str, s, len); re->str[len] = '\0'; @@ -1400,7 +1401,19 @@ rb_reg_new(s, len, options) { VALUE re = rb_reg_s_alloc(rb_cRegexp); - rb_reg_initialize(re, s, len, options); + rb_reg_initialize(re, s, len, options, Qfalse); + return (VALUE)re; +} + +VALUE +rb_reg_compile(s, len, options) + const char *s; + long len; + int options; +{ + VALUE re = rb_reg_s_alloc(rb_cRegexp); + + rb_reg_initialize(re, s, len, options, Qtrue); return (VALUE)re; } |