Jérémie Courrèges-Anglas:
> If no one chimes in, ok to delete it. This being said, here's a
> compile-tested (and may^Wprobably incomplete) attempt to convert it to
> regex(3).
> +@@ -392,7 +392,7 @@ static void build_ts(char *gi, char* cp)
> + tok = Split(cp, &i, S_STRDUP);
> + T.var_RE_name = tok[0];
> + ExpandVariables(tok[1], buf, 0);
> +- if (!(T.var_RE_value=regcomp(buf))) {
> ++ if (regcomp(&T.var_RE_value, buf, REG_BASIC|REG_NOSUB)) {
> + fprintf(stderr, "Regex error in VarREValue Content: %s\n",
> + tok[1]);
> + }
We need REG_EXTENDED.
There is a subtle problem in the error case: var_RE_value will have
an undefined value. However, over in translate.c, regexec() is
blindly called with whatever regcomp() returned.
> +@@ -415,11 +415,23 @@ FindTrans(
> + if (!QRelation(e, t->parent, REL_Parent)) continue;
> +
> + if (t->context) { /* no context specified -> a match */
> ++ char *cp;
> ++ int do_regex = 0;
> ++
> ++ for (do_regex=0,cp=t->context; *cp; cp++) {
> ++ if (!isalnum(*cp) && *cp != '-' && *cp != '.' && *cp != '
> ') {
> ++ do_regex = 1;
> ++ break;
> ++ }
> ++ }
> ++
Ewww.
> + FindContext(e, t->depth, context);
> +
> + /* If reg expr set, do regex compare; else just string compare. */
> +- if (t->context_re) {
> +- if (! regexec(t->context_re, context)) continue;
> ++ if (do_regex) {
> ++ if (regexec(&t->context_re, context, 0, NULL,
> ++ REG_NOTBOL|REG_NOTEOL) != 0)
> ++ continue;
> + }
Why REG_NOTBOL|REG_NOTEOL? I don't think this matches the v8_regexec()
semantics.
My current thinking is to use wrappers, something along these lines:
regex_t *v8regcomp(...)
{
regex_t *re;
if (!(re = malloc(...)))
return NULL;
if (regcomp(re, ...)) {
free(re);
return NULL;
}
return re;
}
int v8regexec(regex_t re, ...)
{
if (!re)
return 0;
return !regexec(re, ...);
}
This would allow us to preserve (regex_t *)NULL to stand for a
nonexistent/invalid regular expression.
--
Christian "naddy" Weisgerber [email protected]