summaryrefslogtreecommitdiff
path: root/re.c
diff options
context:
space:
mode:
Diffstat (limited to 're.c')
-rw-r--r--re.c52
1 files changed, 41 insertions, 11 deletions
diff --git a/re.c b/re.c
index 287c6c1bd4..f8c268ea37 100644
--- a/re.c
+++ b/re.c
@@ -5,7 +5,7 @@
$Author$
created at: Mon Aug 9 18:24:49 JST 1993
- Copyright (C) 1993-1998 Yukihiro Matsumoto
+ Copyright (C) 1993-1999 Yukihiro Matsumoto
************************************************/
@@ -330,7 +330,7 @@ rb_reg_kcode_method(re)
static Regexp*
make_regexp(s, len, flag)
char *s;
- size_t len, flag;
+ int len, flag;
{
Regexp *rp;
char *err;
@@ -392,6 +392,21 @@ match_clone(orig)
return (VALUE)match;
}
+#define MATCH_BUSY FL_USER2
+
+void
+rb_match_busy(match, busy)
+ VALUE match;
+ int busy;
+{
+ if (busy) {
+ FL_SET(match, MATCH_BUSY);
+ }
+ else {
+ FL_UNSET(match, MATCH_BUSY);
+ }
+}
+
int ruby_ignorecase;
static int may_need_recompile;
static VALUE matchcache;
@@ -462,7 +477,7 @@ rb_reg_search(reg, str, start, reverse)
#else
match = rb_backref_get();
#endif
- if (NIL_P(match)) {
+ if (NIL_P(match) || FL_TEST(match, MATCH_BUSY)) {
if (matchcache) {
match = matchcache;
matchcache = 0;
@@ -481,6 +496,8 @@ rb_reg_search(reg, str, start, reverse)
}
result = re_search(RREGEXP(reg)->ptr,RSTRING(str)->ptr,RSTRING(str)->len,
start, range, regs);
+ if (FL_TEST(reg, KCODE_FIXED))
+ kcode_reset_option();
if (result == -2) {
rb_reg_raise(RREGEXP(reg)->str, RREGEXP(reg)->len,
@@ -653,7 +670,7 @@ static VALUE
rb_reg_new_1(klass, s, len, options)
VALUE klass;
char *s;
- size_t len;
+ int len;
int options; /* CASEFOLD = 1 */
/* EXTENDED = 2 */
/* CODE_NONE = 4 */
@@ -703,7 +720,7 @@ rb_reg_new_1(klass, s, len, options)
if (options & ~0x3) {
kcode_reset_option();
}
- rb_obj_call_init((VALUE)re);
+ rb_obj_call_init((VALUE)re, 0, 0);
return (VALUE)re;
}
@@ -711,7 +728,7 @@ rb_reg_new_1(klass, s, len, options)
VALUE
rb_reg_new(s, len, options)
char *s;
- size_t len;
+ int len;
int options;
{
return rb_reg_new_1(rb_cRegexp, s, len, options);
@@ -826,6 +843,9 @@ rb_reg_s_new(argc, argv, self)
case 's': case 'S':
flag |= 12;
break;
+ case 'u': case 'U':
+ flag |= 16;
+ break;
default:
break;
}
@@ -837,7 +857,7 @@ rb_reg_s_new(argc, argv, self)
}
else {
char *p;
- size_t len;
+ int len;
p = str2cstr(src, &len);
return rb_reg_new_1(self, p, len, flag);
@@ -859,8 +879,11 @@ rb_reg_s_quote(re, str)
for (; s != send; s++) {
if (ismbchar(*s)) {
- *t++ = *s++;
- *t++ = *s;
+ size_t n = mbclen(*s);
+
+ while (n--)
+ *t++ = *s++;
+ s--;
continue;
}
if (*s == '[' || *s == ']'
@@ -886,6 +909,8 @@ rb_kcode()
return MBCTYPE_EUC;
case KCODE_SJIS:
return MBCTYPE_SJIS;
+ case KCODE_UTF8:
+ return MBCTYPE_UTF8;
case KCODE_NONE:
return MBCTYPE_ASCII;
}
@@ -905,6 +930,8 @@ rb_reg_get_kcode(re)
kcode |= 8; break;
case KCODE_SJIS:
kcode |= 12; break;
+ case KCODE_UTF8:
+ kcode |= 16; break;
default:
break;
}
@@ -955,7 +982,7 @@ rb_reg_regsub(str, src, regs)
c = *s++;
if (ismbchar(c)) {
- s++;
+ s += mbclen(c) - 1;
continue;
}
if (c != '\\' || s == e) continue;
@@ -1092,7 +1119,10 @@ ignorecase_setter(val)
static VALUE
match_getter()
{
- return match_clone(rb_backref_get());
+ VALUE match = rb_backref_get();
+
+ if (NIL_P(match)) return Qnil;
+ return match_clone(match);
}
static void