expr: a bit more robust handling of regexps with groups (closes bug 87)

This commit is contained in:
Denis Vlasenko 2009-03-03 14:27:36 +00:00
parent 6852effbc2
commit 230997bd61

View File

@ -223,13 +223,13 @@ static VALUE *docolon(VALUE *sv, VALUE *pv)
tostring(pv); tostring(pv);
if (pv->u.s[0] == '^') { if (pv->u.s[0] == '^') {
bb_error_msg("\ bb_error_msg(
warning: unportable BRE: `%s': using `^' as the first character\n\ "warning: '%s': using '^' as the first character\n"
of a basic regular expression is not portable; it is being ignored", pv->u.s); "of a basic regular expression is not portable; it is ignored", pv->u.s);
} }
memset(&re_buffer, 0, sizeof(re_buffer)); memset(&re_buffer, 0, sizeof(re_buffer));
memset(re_regs, 0, sizeof(*re_regs)); memset(re_regs, 0, sizeof(re_regs));
xregcomp(&re_buffer, pv->u.s, 0); xregcomp(&re_buffer, pv->u.s, 0);
/* expr uses an anchored pattern match, so check that there was a /* expr uses an anchored pattern match, so check that there was a
@ -238,7 +238,7 @@ of a basic regular expression is not portable; it is being ignored", pv->u.s);
&& re_regs[0].rm_so == 0 && re_regs[0].rm_so == 0
) { ) {
/* Were \(...\) used? */ /* Were \(...\) used? */
if (re_buffer.re_nsub > 0) { if (re_buffer.re_nsub > 0 && re_regs[1].rm_so >= 0) {
sv->u.s[re_regs[1].rm_eo] = '\0'; sv->u.s[re_regs[1].rm_eo] = '\0';
v = str_value(sv->u.s + re_regs[1].rm_so); v = str_value(sv->u.s + re_regs[1].rm_so);
} else { } else {
@ -251,7 +251,7 @@ of a basic regular expression is not portable; it is being ignored", pv->u.s);
else else
v = int_value(0); v = int_value(0);
} }
//FIXME: sounds like here is a bit missing: regfree(&re_buffer); regfree(&re_buffer);
return v; return v;
} }