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);
|
||||
|
||||
if (pv->u.s[0] == '^') {
|
||||
bb_error_msg("\
|
||||
warning: unportable BRE: `%s': using `^' as the first character\n\
|
||||
of a basic regular expression is not portable; it is being ignored", pv->u.s);
|
||||
bb_error_msg(
|
||||
"warning: '%s': using '^' as the first character\n"
|
||||
"of a basic regular expression is not portable; it is ignored", pv->u.s);
|
||||
}
|
||||
|
||||
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);
|
||||
|
||||
/* 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
|
||||
) {
|
||||
/* 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';
|
||||
v = str_value(sv->u.s + re_regs[1].rm_so);
|
||||
} else {
|
||||
@ -251,7 +251,7 @@ of a basic regular expression is not portable; it is being ignored", pv->u.s);
|
||||
else
|
||||
v = int_value(0);
|
||||
}
|
||||
//FIXME: sounds like here is a bit missing: regfree(&re_buffer);
|
||||
regfree(&re_buffer);
|
||||
return v;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user