expr: a bit more robust handling of regexps with groups (closes bug 87)
This commit is contained in:
parent
6852effbc2
commit
230997bd61
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user