diff options
author | Duncaen <mail@duncano.de> | 2019-01-28 14:38:05 +0100 |
---|---|---|
committer | Leah Neukirchen <chneukirchen@gmail.com> | 2020-05-15 18:41:13 +0200 |
commit | 28d0d51e348a92d74745c2c48adce815f24497b6 (patch) | |
tree | 4ad3e97e01e55897f87e4406be2b8beba1ecde8a | |
parent | 8f0b6e2117cd2f3f81ca8572dea4f243ce831610 (diff) | |
download | mblaze-28d0d51e348a92d74745c2c48adce815f24497b6.tar.gz mblaze-28d0d51e348a92d74745c2c48adce815f24497b6.tar.xz mblaze-28d0d51e348a92d74745c2c48adce815f24497b6.zip |
mpick: add freeexpr
-rw-r--r-- | mpick.c | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/mpick.c b/mpick.c index f9da79d..e1f9478 100644 --- a/mpick.c +++ b/mpick.c @@ -220,6 +220,50 @@ mkexpr(enum op op) return e; } +static void +freeexpr(struct expr *e) +{ + if (!e) return; + switch (e->op) { + case EXPR_OR: + case EXPR_AND: + freeexpr(e->a.expr); + freeexpr(e->b.expr); + break; + case EXPR_COND: + freeexpr(e->a.expr); + freeexpr(e->b.expr); + freeexpr(e->c.expr); + break; + case EXPR_NOT: + freeexpr(e->a.expr); + break; + case EXPR_REDIR_FILE: + case EXPR_REDIR_PIPE: + free(e->a.string); + free(e->b.string); + break; + case EXPR_STREQ: + case EXPR_STREQI: + case EXPR_GLOB: + case EXPR_GLOBI: + case EXPR_REGEX: + case EXPR_REGEXI: + switch (e->a.prop) { + case PROP_PATH: + case PROP_FROM: + case PROP_TO: + break; + default: free(e->a.string); + } + if (e->op == EXPR_REGEX || e->op == EXPR_REGEXI) + regfree(e->b.regex); + else + free(e->b.string); + } + free(e); +} + static struct expr * chain(struct expr *e1, enum op op, struct expr *e2) { @@ -1299,6 +1343,8 @@ main(int argc, char *argv[]) if (Tflag && thr) do_thr(); + freeexpr(expr); + if (vflag) fprintf(stderr, "%ld mails tested, %ld picked.\n", i, kept); |