summaryrefslogtreecommitdiff
path: root/re.c
diff options
context:
space:
mode:
authormatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2004-09-24 05:53:43 +0000
committermatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2004-09-24 05:53:43 +0000
commitc0a998d027eac8e9dc6d85b4b56c5e5bc87024a0 (patch)
tree49adb0e44abfd9d14f9c47517039e333bb98c50a /re.c
parent0c9d76889af8e00a946dbe8de33568fc87bdd983 (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.c53
1 files changed, 33 insertions, 20 deletions
diff --git a/re.c b/re.c
index 2cc90ae312..8fbd3b568a 100644
--- a/re.c
+++ b/re.c
@@ -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;
}