aboutsummaryrefslogtreecommitdiffstats
path: root/regcomp.c
diff options
context:
space:
mode:
authorArnold D. Robbins <arnold@skeeve.com>2011-05-18 22:12:29 +0300
committerArnold D. Robbins <arnold@skeeve.com>2011-05-18 22:12:29 +0300
commit77459046d0c79ac5538f7da6731fbdb15c8d10fc (patch)
treeb5b2d79f4925c5f772dd5bd2b81ab78396286141 /regcomp.c
parentad61e1cba6053cac959d227dfdf2aaae0a01c125 (diff)
downloadegawk-77459046d0c79ac5538f7da6731fbdb15c8d10fc.tar.gz
egawk-77459046d0c79ac5538f7da6731fbdb15c8d10fc.tar.bz2
egawk-77459046d0c79ac5538f7da6731fbdb15c8d10fc.zip
Update regex; fix to io.c; update de.po, fi.po.
Diffstat (limited to 'regcomp.c')
-rw-r--r--regcomp.c19
1 files changed, 16 insertions, 3 deletions
diff --git a/regcomp.c b/regcomp.c
index 63a365d9..ab37a6f7 100644
--- a/regcomp.c
+++ b/regcomp.c
@@ -2206,16 +2206,21 @@ parse_branch (re_string_t *regexp, regex_t *preg, re_token_t *token,
exp = parse_expression (regexp, preg, token, syntax, nest, err);
if (BE (*err != REG_NOERROR && exp == NULL, 0))
{
+ if (tree != NULL)
+ postorder (tree, free_tree, NULL);
return NULL;
}
if (tree != NULL && exp != NULL)
{
- tree = create_tree (dfa, tree, exp, CONCAT);
- if (tree == NULL)
+ bin_tree_t *newtree = create_tree (dfa, tree, exp, CONCAT);
+ if (newtree == NULL)
{
+ postorder (exp, free_tree, NULL);
+ postorder (tree, free_tree, NULL);
*err = REG_ESPACE;
return NULL;
}
+ tree = newtree;
}
else if (tree == NULL)
tree = exp;
@@ -2464,7 +2469,11 @@ parse_sub_exp (re_string_t *regexp, regex_t *preg, re_token_t *token,
{
tree = parse_reg_exp (regexp, preg, token, syntax, nest, err);
if (BE (*err == REG_NOERROR && token->type != OP_CLOSE_SUBEXP, 0))
- *err = REG_EPAREN;
+ {
+ if (tree != NULL)
+ postorder (tree, free_tree, NULL);
+ *err = REG_EPAREN;
+ }
if (BE (*err != REG_NOERROR, 0))
return NULL;
}
@@ -3092,6 +3101,10 @@ parse_bracket_exp (re_string_t *regexp, re_dfa_t *dfa, re_token_t *token,
if (BE (sbcset == NULL, 0))
#endif /* RE_ENABLE_I18N */
{
+ re_free (sbcset);
+#ifdef RE_ENABLE_I18N
+ re_free (mbcset);
+#endif
*err = REG_ESPACE;
return NULL;
}