static void free_pattern_expr(struct grep_expr *x) { switch (x->node) { case GREP_NODE_ATOM: break; case GREP_NODE_NOT: free_pattern_expr(x->u.unary); break; case GREP_NODE_AND: case GREP_NODE_OR: free_pattern_expr(x->u.binary.left); free_pattern_expr(x->u.binary.right); break; } free(x); }
void free_grep_patterns(struct grep_opt *opt) { struct grep_pat *p, *n; for (p = opt->pattern_list; p; p = n) { n = p->next; switch (p->token) { case GREP_PATTERN: /* atom */ case GREP_PATTERN_HEAD: case GREP_PATTERN_BODY: if (p->kws) kwsfree(p->kws); else if (p->pcre_regexp) free_pcre_regexp(p); else regfree(&p->regexp); free(p->pattern); break; default: break; } free(p); } if (!opt->extended) return; free_pattern_expr(opt->pattern_expression); }